多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 1. 前言 对于前面写过的navite方法,这里可以使用javah命令来生成对应的c文件。步骤如下: * 进入到Java文件的目录中,使用javac生成对应的.class文件; * 在.class文件目录下执行javah,生成头文件。 # 2. javah生成对应的C语言头文件 这里项目中build后就生成了对应的字节码文件,这里直接使用: ![](https://img.kancloud.cn/17/7a/177aeb32a060e2b1d7dbdbb25c54d46e_379x140.png) 然后使用: ``` javah -d 文件生成路径 全类名 ``` 比如我这里为: ``` javah -d D:\openSourceLearnProject\Android\CustomView\myapplication\build\intermediates\javac\debug\classes com.weizu.jnitest.JNITest ``` 然后就回在该目录下生成对应的c文件,也就是: ![](https://img.kancloud.cn/5b/c6/5bc66a5c34dbf37dbe2ddd3f5fb5243b_988x169.png) 打开文件,内容为: ``` /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_weizu_jnitest_JNITest */ #ifndef _Included_com_weizu_jnitest_JNITest #define _Included_com_weizu_jnitest_JNITest #ifdef __cplusplus extern "C" { #endif /* * Class: com_weizu_jnitest_JNITest * Method: helloJni * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_weizu_jnitest_JNITest_helloJni (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif ``` 也就是说,在C中该怎么写这个方法,在这个头文件中已经定义好了,故而可以在我们自己配置的native-lib.cpp文件中进行方法声明拷贝,然后编写。不妨再次看下创建C++项目自动生成得native-lib.cpp文件: ~~~ #include <jni.h> #include <string> extern "C" JNIEXPORT jstring JNICALL Java_com_weizu_jnitest_JNITest_helloJni( JNIEnv* env, jobject /* this */) { std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str()); } ~~~ 很明显,方法名是一样的。 # 3. 使用头文件 对于生成的这个头文件,可以直接拷贝到我们的src/main/cpp/目录中。 ![](https://img.kancloud.cn/8a/92/8a925e12b6afc18b668039cdc225aa3e_430x146.png) 然后将cpp文件中使用的头文件引用拷贝到.h文件中,就可以简写一部分: ~~~ // native-lib.cpp #include "com_weizu_jnitest_JNITest.h" extern "C" jstring Java_com_weizu_jnitest_JNITest_helloJni( JNIEnv* env, jobject /* this */) { std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str()); } ~~~ 且在Android Studio中可以看到这两个方法关联上了: ![](https://img.kancloud.cn/d1/3a/d13a0be0a31bc8049ddd11725ce63d2c_631x220.png) 运行程序,最后还是成功显示了日志: ![](https://img.kancloud.cn/3b/4f/3b4f85da730f60b1f56a4920f2f4e4b7_930x183.png)