大家好。被JNI折磨憔悴了。
Java环境下使用JNI调用本地 C/C++ 库我倒研究出了点眉目,就是先定义native,再javah,新建C++项目,拷贝jni.h、jni_md.h,再如此这般。
我C懂点、C++勉强算得上白痴水平。
现在我手头有个android项目,是个视频播放器,有个需求是要实现对指定加密的视频实现解密,解码模块的是C++的实现,代码已经在我手里,是一个".h"和".so"文件。
我已经试了一天,企图将这个C++在Android中使用起来。愣是没成,一直报“ERROR/AndroidRuntime(426): java.lang.UnsatisfiedLinkError: Library libdcry not found”
祈求各路菩萨大慈大悲救我一命。
就是怎样将现有的C++代码,在Android中跑起来。。。。。。。。。
先感谢大伙了!!!
------解决方案--------------------
jni部分是使用c++写的么?
如果是 在JNI里面要 extern "C"{jni c++代码}
------解决方案--------------------
或者在jni里面模仿android的jni
重写jint JNI_OnLoad(JavaVM* vm, void* reserved)方法
------解决方案--------------------
so文件已经生成好了吗,
放在路径 libs/armeabi/下,这样就可直接System.load("so文件名")
------解决方案--------------------
上面某位应该说的是System.loadLibrary方法
java的JNI怎么讲究android的同样也要怎么讲究
------解决方案--------------------
java端定义好对应的native方法(和C++端一定严格对应), System.loadLibrary之后再java端用到什么就调用相应的native方法即可。
------解决方案--------------------
帮顶,没具体研究过jni调用c/C++代码的用法。
你这个是直接找不到库,加载lib的地方难道方法不对?
另外,lib库的静态编译和动态编译有影响吗?
------解决方案--------------------
是不是你的那个.so还要依赖其他的.so,而你没有啊
------解决方案--------------------
ERROR/AndroidRuntime(426): java.lang.UnsatisfiedLinkError: Library libdcry not found
这一句提示很明确了
就是java在调用native的方法时,没有找到这个native方法。
找原因:
1. System.loadLibrary(xxx);
上加try catch,看对不对。
注意System.loadLibrary 和System.load, 括号后面的参数是不一样的。
2. 检查一下,C++中的函数和java中的native方法对应好了没有,有没有漏掉的什么的
3. C++还是自己写Jni_onLoad,给你个例子:
extern "C" jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
JNIEnv* env = NULL;
jint result = -1;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
LOGE("GetEnv failed!");
return result;
}
LOG_ASSERT(env, "Could not retrieve the env!");
if(jniRegisterNativeMethods(env, "com/xxx/xxx/xxx",
xxxMethods, NELEM(xxxMethods)) != 0){
LOGE("Register method to com/xxx/xxx/xxxf ailed!");
return -1;
}
return JNI_VERSION_1_4;
}
打印足够的trace,看到底哪里出错了。
JNI实际上是很简单的,与C++关系也不算大。
------解决方案--------------------
android-2.2\development\samples\SimpleJNI
看看源码包的这个目录
还有看看这个文档
http://www.360doc.com/content/10/1012/06/3822981_60261755.shtml
------解决方案--------------------
换了我就只有一个笨方法,
根据头文件重写jni
然后和已有的头文件and .so库
重新编译一个so库出来
------解决方案--------------------
Library libdcry not found
还是库文件没有找到啊,更不要说里面的方法了~看看你把这个文件放的目录对不对,拷贝到其它目录下试试~
------解决方案--------------------
如果拿到的so库是封装好jni的,你看不到他jni封装的格式,你怎么建立对应的java native方法包名,类名呢?同名的java方法对应的jni方法还有不同的签名,参数也不一定是完全对应。
所以还是重新封jni吧
------解决方案--------------------
哥哥来了,
你显然理解错了。人家给你的so并非你可以调用的JNI。 你必须重新封装别人给你的方法,然后提供本地java代码。
因为他提供给你的不过是so,并没有本地方法,比如说liba.so。 你必须自己定义b.cpp和 c.java 在 b.cpp 中写你需要的方法, 然后在c.java 里面装载由b生成的so。并提供和b中对应的java方法。