Android JNI 自己遇到的问题记录

本文探讨了Java Native Interface (JNI) 在Android应用中遇到的问题,包括找不到本地方法及方法未实现的情况,并提供了可能的解决方案。

1.


                                                                java.lang.UnsatisfiedLinkError: Native method not found: .contentsend.ContentSendJNI.setContentType:(I)V
                                                                    at com.svocloud.vcs.polycom.contentsend.ContentSendJNI.setContentType(Native Method)
                                                                    at com.svocloud.vcs.polycom.contentsend.ContentSendJNI.initContent(ContentSendJNI.java:46)
                                                                    at com.svocloud.vcs.main.AppApplication.initiallize(AppApplication.java:679)
                                                                    at com.svocloud.vcs.main.AppApplication.onCreate(AppApplication.java:150)
                                                                    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1000)
                                                                    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4587)
                                                                    at android.app.ActivityThread.access$1300(ActivityThread.java:157)
                                                                    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1401)
                                                                    at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                    at android.os.Looper.loop(Looper.java:153)
                                                                    at android.app.ActivityThread.main(ActivityThread.java:5318)
                                                                    at java.lang.reflect.Method.invokeNative(Native Method)
                                                                    at java.lang.reflect.Method.invoke(Method.java:511)
                                                                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
                                                                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
                                                                    at dalvik.system.NativeStart.main(Native Method)


这个是在加载本地方法的时候,应该是没有加载这个lib包,

未发现原因是,有很多so的包,其他的功能都是MFW的jar包里面封装好了,就是剩下两个没有封装进去,所以需要自己手动加载,加载后就有了


java.lang.UnsatisfiedLinkError: 

No implementation found for void com.polycom.mfw.contentsend.ContentSendJNI.setContentType(int) 

(tried Java_com_polycom_mfw_contentsend_ContentSendJNI_setContentType

 and Java_com_polycom_mfw_contentsend_ContentSendJNI_setContentType__I)
                                                                           at com.polycom.mfw.contentsend.ContentSendJNI.setContentType(Native Method)
                                                                           at com.polycom.mfw.contentsend.ContentSendJNI.initContent(ContentSendJNI.java:46)
                                                                           at com.svocloud.vcs.main.AppApplication.initiallize(AppApplication.java:679)
                                                                           at com.svocloud.vcs.main.AppApplication.onCreate(AppApplication.java:150)
                                                                           at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1012)
                                                                           at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4557)
                                                                           at android.app.ActivityThread.access$1500(ActivityThread.java:151)
                                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1364)
                                                                           at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                           at android.os.Looper.loop(Looper.java:135)
                                                                           at android.app.ActivityThread.main(ActivityThread.java:5258)
                                                                           at java.lang.reflect.Method.invoke(Native Method)
                                                                           at java.lang.reflect.Method.invoke(Method.java:372)
                                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)


这个是找到方法,但是没有实现

现在来说,已经成功加载so,但是调用方法的时候并没有按照相应的位置去放置调用类,JNI有很严格的标准,方法名和返回值





### Android JNI 函数使用教程 JNI(Java Native Interface)允许 Java 和 C/C++ 之间进行交互。以下是关于 JNI 的常见用法、示例代码以及调试方法。 #### JNI 基础概念 JNI 是一种标准接口,用于让 Java 应用程序调用本地代码(通常是 C 或 C++)。通过 JNI,开发者可以在性能敏感的部分使用高效的原生代码[^4]。 --- #### 示例代码:定义并实现一个简单的 JNI 方法 假设我们有以下 Java 类 `MyClass`: ```java public class MyClass { static { System.loadLibrary("native-lib"); } public native void myMethod(int number, String message); public static void main(String[] args) { new MyClass().myMethod(10, "Hello from Java!"); } } ``` 对应的 C 实现如下所示: ```c #include <jni.h> #include <stdio.h> JNIEXPORT void JNICALL Java_MyClass_myMethod(JNIEnv *env, jobject obj, jint number, jstring message) { const char *msg = (*env)->GetStringUTFChars(env, message, NULL); printf("Number: %d\n", (int)number); printf("Message: %s\n", msg); (*env)->ReleaseStringUTFChars(env, message, msg); } ``` 上述代码展示了如何在 C 中访问传递给 JNI 方法的参数,并打印它们到控制台。 --- #### 调试 JNI 函数的方法 当遇到 JNI 错误时,可以通过以下方式定位问题: - **检查异常**:每次调用 JNI 函数后,应立即检查是否存在未捕获的异常。例如,在尝试加载不存在的类时,可以这样处理[^1]: ```c jclass cls = (*env)->FindClass(env, "com/example/NonExistentClass"); if ((*env)->ExceptionCheck(env)) { (*env)->ExceptionDescribe(env); (*env)->ExceptionClear(env); return; } ``` - **日志记录**:利用 `printf` 或其他工具来跟踪变量状态和流程。 - **断点调试**:借助 IDE 工具(如 Android Studio),设置断点逐步分析原生代码的行为。 --- #### 常见错误及其解决方案 1. **找不到类 (`NoClassDefFoundError`)** 如果 `FindClass` 返回为空,则可能是由于包名拼写错误或类尚未被加载引起的[^2]。确保完整的类路径正确无误。 2. **线程同步问题** 在某些情况下,Android 可能会在特定条件下挂起线程以完成垃圾回收或其他操作。这不会影响当前正在运行的原生代码,但在下一次 JNI 调用期间可能会触发暂停行为[^3]。 3. **内存泄漏** 忽略释放资源可能导致严重的内存泄露问题。务必始终成对调用分配器与释放器,比如 `NewGlobalRef` 和 `DeleteGlobalRef`。 4. **签名不匹配** 当声明的返回类型或者参数列表不符合实际需求时会发生此情况。建议自动生成头文件以减少人为失误风险: ```bash javah -classpath bin/classes -o MyHeader.h com.example.MyClass ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值