此文章包含Android JNI学习过程中的遇到的各种错误记录和学习总结。
1.错误:java.lang.UnsatisfiedLinkError: Native method not found: com.example.test.InterfaceJni.init:()V
已经生生so库,提示找不到native方法。
解决方法:
- 看.h或者.cpp文件中,方法名是否正确,Java_包名_类名_方法名(参数表)。
- .h或者.cpp文件中native方法声明和定义必须包含在extern "C"{}中。
2.JNI_OnLoad()
在System.loadLibrary时,调用此函数,返回JNI版本,不同的版本支持的特性可能不同。也可以做一些初始化的动作。
3.android打印。在c++层或者c中的打印(print),不能在logcat中查看。需要调用android/log.h中的log打印:
__android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__) :ANDROID_LOG_DEBUG是打印级别,TAG是打印的标签,__VA_ARGS__是打内容。
可以这样使用:
#include <android/log.h>
#define TAG "TEST_CPP"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG,__VA_ARGS__)
使用:LOGD("In C:\n---------");
另外,链接时可能会提示:error: undefined reference to '__android_log_print',是因为没有加入共享库,在mk文件中加入:
LOCAL_LDLIBS := -llog
4.修改Android ping.c代码,增加socket通信,增加头文件:#include <cutils/sockets.h>,编译出错:undefined reference 。
解决方法:修改Android.mk,增加:LOCAL_SHARED_LIBRARIES+= libcutils