JNI 注意事项:
一、在开发时 首先要把环境 搭建好,包括各个文件配置,和C代码的实现。C代码可以直接return 返回值,先不做实现。
二、常见报错:
java.lang.UnsatisfiedLinkError: Native method not found: 要注意java方面名和C函数名 是否匹配了
java.lang.UnsatisfiedLinkError: Hello :连接不到库的问题:如果确认代码没问题后,原因可能是环境问题。需要重新clean ,build 工程。
三、javah 命令
自动生成 java本地方法对应的c代码的方法名 javah 指令 +全类名
1.6 class
C:\workspace\HelloWorldFromC2\bin\classes
1.7 src
C:\workspace\HelloWorldFromC2\src
四、 引用别人.so 函数库 需要你自己native方法对应类的包名 和之前打包成.so函数库的包名一致
五、javap -s 命令:查看java方法的签名
C语言回调java方法 java代码开发好了 一个方法 C会掉java代码
javap -s 打印方法的签名 注意要cd到 C:\workspace\HelloWorldFromC2\bin\classes 传全类名
通过反射 调用java代码
Class<?> forName = Class.forName("com.example.ndkcallback.DataProvider");
Method declaredMethod = forName.getDeclaredMethod("helloFromJava", new Class[]{});
declaredMethod.invoke(forName.newInstance(), new Object[]{});
///jclass (*FindClass)(JNIEnv*, const char*);
jclass clazz=(*env)->FindClass(env,"com/example/ndkcallback/DataProvider");
// jmethodID (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
// 方法签名 参数和返回值
jmethodID methodId=(*env)->GetMethodID(env,clazz,"helloFromJava","()V");
// void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
(*env)->CallVoidMethod(env,jobject,methodId);
六、多个C文件怎么编译?
在 LOCAL_SRC_FILES 变量后面 加上要编译的所有的C文件,用空格隔开即可。
例如:
Anroid.mk 文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := hello
LOCAL_SRC_FILES := Hello.c Hello2.c Hello3.c Hello4.c Hello5.c Hello6.c
include $(BUILD_SHARED_LIBRARY)
七、dos 的cd /d 命令:
C:\user...\> cd /d D:\a\b\c 执行后自动进入D盘的c目录