NDK使用动态库(共享库的有关问题)
NDK使用动态库(共享库的问题)
(1)生成动态库
建一个名为JNI的文件夹,之后在里面添加两个文件,分别是add.c和Android.mk,如下所示
add.c
Android.mk
ndk-build之后,得到了libadd.so
(2)修改hello-jni项目
hello-jni是自带的列子,我试图在返回字符串之前调用一下动态库里的add(int,int)方法,修改后如下
hello-jni.c
Android.mk
对了,我还在include文件中添了一个简单的add.h
我当然也在JNI目录下加了libadd.so
最后我当然用NDK 7 编译通过了,并且在\hello-jni\libs\armeabi有两个库libadd.so和libhello-jni.so
库libadd.so,是自动复制过去的,不是我手动复制过去的
本来觉得这下应该没问题了吧,可是抛出错误:
03-20 23:17:30.434: D/dalvikvm(192): Trying to load lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x43757ca8
03-20 23:17:30.474: I/dalvikvm(192): Unable to dlopen(/data/data/com.example.hellojni/lib/libhello-jni.so): Cannot load library: link_image[1638]: 30 could not load needed library 'libadd.so' for 'libhello-jni.so' (load_library[984]: Library 'libadd.so' not found)
我非常不明白这是为什么呢?大家有遇到过这个问题吗?该如何解决呢?
------解决方案--------------------
LOCAL_SHARED_LIBRARIES := -ladd 加上-l
------解决方案--------------------
LOCAL_SHARED_LIBRARIES := add 这样没错
(1)生成动态库
建一个名为JNI的文件夹,之后在里面添加两个文件,分别是add.c和Android.mk,如下所示
add.c
#include <stdio.h>
int add(int a, int b)
{
return a + b;
}
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := add
LOCAL_SRC_FILES := add.c
include $(BUILD_SHARED_LIBRARY)
ndk-build之后,得到了libadd.so
(2)修改hello-jni项目
hello-jni是自带的列子,我试图在返回字符串之前调用一下动态库里的add(int,int)方法,修改后如下
hello-jni.c
#include <string.h>
#include <jni.h>
#include <stdio.h>
#include <add.h>
jstring
Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env,
jobject thiz )
{
add(1, 2);
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := add
LOCAL_SRC_FILES := libadd.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := hello-jni
LOCAL_SRC_FILES := hello-jni.c
LOCAL_SHARED_LIBRARIES := add
include $(BUILD_SHARED_LIBRARY)
对了,我还在include文件中添了一个简单的add.h
int add(int a, int b)
我当然也在JNI目录下加了libadd.so
最后我当然用NDK 7 编译通过了,并且在\hello-jni\libs\armeabi有两个库libadd.so和libhello-jni.so
库libadd.so,是自动复制过去的,不是我手动复制过去的
本来觉得这下应该没问题了吧,可是抛出错误:
03-20 23:17:30.434: D/dalvikvm(192): Trying to load lib /data/data/com.example.hellojni/lib/libhello-jni.so 0x43757ca8
03-20 23:17:30.474: I/dalvikvm(192): Unable to dlopen(/data/data/com.example.hellojni/lib/libhello-jni.so): Cannot load library: link_image[1638]: 30 could not load needed library 'libadd.so' for 'libhello-jni.so' (load_library[984]: Library 'libadd.so' not found)
我非常不明白这是为什么呢?大家有遇到过这个问题吗?该如何解决呢?
------解决方案--------------------
LOCAL_SHARED_LIBRARIES := -ladd 加上-l
------解决方案--------------------
LOCAL_SHARED_LIBRARIES := add 这样没错