1、下载NDK
2、新建一个类,声明native方法。
这个类是java与c/c++交互的中介,方法由java声明,逻辑有C/C++实现。
public class MyJni{
//加载so库
static{
System.loadLibrary("JniTest");
}
//native方法
public static native String sayHello();
}
3、点击Android studio中的Build
Paste_Image.png点击Make Project等待编译。
3.1、打开终端,可以是dos或者是Android studio的Terminal切换到目录下,假设我的目录是:ndk----->build----->intermediates--->classes--->debug
Paste_Image.pngPaste_Image.png输入命令:javah -jni 包名路劲下的类文件
4、点开Module(app)下的build--->intermediates--->classes-->debug下会看到一个.h的文件
5、在main文件夹下创建jni文件夹,把之前的.h文件拷贝到jni,在新建一个main.c文件,把.h的文件代码全部复制到main.c中。
1、生成的.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_binbin_testjni_myJNI */
#ifndef _Included_com_example_binbin_testjni_myJNI
#define _Included_com_example_binbin_testjni_myJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_binbin_testjni_myJNI
* Method: sayHello
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_example_binbin_testjni_myJNI_sayHello
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
2、拷贝修改后的main.c
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_binbin_testjni_myJNI */
#ifndef _Included_com_example_binbin_testjni_myJNI
#define _Included_com_example_binbin_testjni_myJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_example_binbin_testjni_myJNI
* Method: sayHello
* Signature: ()Ljava/lang/String;
*/
//就实现了个函数 JNIEnv的用法可以自行百度,这里就不展开了
JNIEXPORT jstring JNICALL Java_com_example_binbin_testjni_myJNI_sayHello
(JNIEnv *env, jclass jobj){
//返回一句话
return (*env)->NewStringUTF(env,"JNI hahahahahahahaha");
}
#ifdef __cplusplus
}
#endif
#endif
6、配置NDK的路径
打开工程下的local.properties文件添加NDK路径
Paste_Image.png7、打开app Module的build.gradle文件,
在defaultConfig节点里添加代码。
ndk{
moduleName "JniTest";
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}
注意:这里的moduleName是在之前编写的类里面加载的so库名。
8、在工程下的gradle.properties里加一句话:
android.useDeprecatedNdk = true
9、生成so库。
点击菜单栏上的Build,然后点击rebuild Project
Paste_Image.png
然后在项目中的app\build\intermediates\ndk\debug\lib可以看到三个文件夹“armeabi”、“armerbi-v7a”、"x86"点开就是so库
Paste_Image.png10、配置so库
在src/main下新建文件夹jniLibs,生成so文件拷贝到改文件夹下。
Paste_Image.png11、使用jni
因为native方法声明成了静态方法,直接调用即可
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
TextView test = new TextView(this);
test.setText(MyJni.sayHello());
}
界面上就是显示在C文件中的内容了。
踩了挺多坑的,有时候生成的文件不对,有时候生成的文件名怪怪的,慢慢踩就好。注意:C和C++写的方式略有不同,C文件中(*env)->,而在C++中可以用evn->
鄙人不才,如有错误还望大神指点一二!!!!
网友评论