JNI(Java Native Interface),写这玩意儿的用处:能够在java中调用c/c++的方法。
NDK(Native Development Kit),就是写JNI需要的一个工具。
写这个demo的前提,你已经下载好了NDK,并且配置好了他的环境变量。
进入正题:
第一步:
新建一个AS项目:JniDemo2。如图配置项目的NDK环境。
第二步:
在java文件夹下新建JniUtils类
public class JniUtils {
static {
System.loadLibrary("JNISample");//名字要与build.gradle中配置的一致
}
public static native String getStringFromC();
}
第三步:
Make Project
第四步:
打开Terminal,然后在命令行中先进入到工程的build\intermediates\classes\debug目录下(cd 直接拖拽debug目录即可)
第五步:
使用javah命令生成.h头文件。
第六步:
新建一个JNI文件夹,将生成的.h文件复制过来
.h文件所在目录(debug文件夹下)
第七步:
在jni文件夹下新建一个c语言文件:HelloJni
#include "com_example_qny_jnidemo_JniUtils.h" //头文件的名字要对应
//方法名也要对应,格式:Java_+头文件名+JniUtils类中的方法名。例如:com_example_qny_jnidemo_JniUtils + _getStringFromC(注意这里的下划线)
JNIEXPORT jstring JNICALL Java_com_example_qny_jnidemo_JniUtils_getStringFromC
(JNIEnv *env, jclass obj){
char* text = "Im from cccccccccccccc";
return (*env) -> NewStringUTF(env,text);
}
第八步:
在app目录下的build.gradle中添加
ndk {
moduleName "JNISample" //生成so库的名字,这里要与JniUtils类中的static块中的名字相同
}
第九步:
在gradle.properties文件中加入以下代码
android.useDeprecatedNdk=true
第十步:
在MainActivity 中打印输出,验证是否成功使用java语言调用c程序
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//使用java代码调用c语言程序
JniUtils jniUtils = new JniUtils();
Log.d("JniInFo",jniUtils.getStringFromC());
}
}
运行程序会出现这个bug
出现bug不要慌~我们操作一波,然后重启AS就没了。
再次运行后成功调用!:
最后贴一张整个项目的截图:
参考的文章,我觉得作者的c语言文件代码写错了,我是改过以后才成功运行的,用他写的没运行成功。
https://www.jianshu.com/p/1955dc248d72