JNI(四)、其他注意事项


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目录




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值