ubuntu下的android studio jni生成c++动态库的调用方法及排错(ndk生成的动态库调用)

来源:互联网 发布:1×1矩阵的值怎么求 编辑:程序博客网 时间:2024/05/21 16:18
1、新建一个android项目,在app目录下创建一个jni文件夹。放javah编译后的头文件以及源文件的。
2、新建一个java类。
public class TestJni{
public native int add(int x,int y);
}
之后编译工程。在app/build/intermediates/classes/debug/工程包名/xxx 下会生成一个TestJni.class。然后编译该TestJni.class.回到debug目录下。进入终端输入javah 工程包名.xxx,
在debug目录下生成jni的头文件;格式如下:
JNIEXPORT jint JINCALL Java_包名_TestJni_add(JNIEnv *,object,hint,jint);
将头文件复制到jni目录下,并建立一个cpp源文件。源文件实现功能:
JNIEXPORT jint JINCALL Java_包名_TestJni_add(JNIEnv *ENV,object obj,jint x,jint y)
{
return x+y;
}


在jni下建立Android.mk,属于android下的makefile文件。进行idk编译生成需要的动态库.实现如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := TestJni
LOCAL_SRC_FILES := 源文件
include $(BUILD_SHARED_LIBRARY)
完成后,进入到jni目录下.输入ndk-build。可能会生成动态库失败,原因可能如下:
(1)没有设置ndk路径,可以在sudo edit ~/.bashrc 中设置。
export NDK_HOME=/xxx/xxx/xxx/android-ndk-r10d
export PATH=$NDK_HOME:$PATH

(2)可在as工程下的,local.properties中,设置ndk.dir=/xxx/xxx/xxx/android-ndk-r10d

配置完成后编译产生的错误,Execution failed for task”:app:compileDebugNdk”.会提醒你在grade.properties中加入

android.useDeprecatedNdk=true.


生成动态库成功,在libs/armeabi下。

可能因为手机cpu型号的不同需要建立其它文件夹 armeabi-v7a、x86i 将生成的动态库拷贝到目录下。


在MainActivity调用该动态库
public class MainActivity extends Activity{


static{
System.loadLibrary(“TestJni”);
}
protected void onCreated(Bundle saveInstanceState)
{
super.onCreated(saveInstanceState);
TestJni jni = new TestJni();
int value jni->add(10,10);
 }

}


转:

NDK 编译和使用静态库、动态库

情况一:编译静态库

情况二:编译动态库

情况三:编译动态库+静态库

情况四:已有第三方静态库(动态库),编译静态库(动态库)


默认所有代码和文件在$project/jni下,否则特殊说明。

情况一:编译静态库

文件Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_STATIC_LIBRARY)


文件Application.mk:

APP_MODULES :=hello-jni


情况二:编译动态库

文件Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := hello-jni
LOCAL_SRC_FILES := hello-jni.c
include $(BUILD_SHARED_LIBRARY)

情况三:编译动态库+静态库

文件Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE    := mylib_static
LOCAL_SRC_FILES := src.c
include $(BUILD_STATIC_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE    := mylib_shared
LOCAL_SRC_FILES := src2.c

LOCAL_STATIC_LIBRARIES := mylib_static

include $(BUILD_SHARED_LIBRARY)

情况四:已有第三方静态库(动态库),编译静态库(动态库)

文件Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := thirdlib1      # name it whatever
LOCAL_SRC_FILES := $(TARGET_ARCH_ABI)/libthird1.a     # or $(so_path)/libthird1.so
#LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/include
include $(PREBUILT_STATIC_LIBRARY)    #or PREBUILT_SHARED_LIBRARY

include $(CLEAR_VARS)
LOCAL_MODULE    := mylib_use_thirdlib
LOCAL_SRC_FILES := src.c

LOCAL_STATIC_LIBRARIES := thirdlib1       #or LOCAL_SHARED_LIBRARY 

include $(BUILD_SHARED_LIBRARY)   #如果编译静态库,需要Application.mk



http://www.jianshu.com/p/d8cde65cb4f7

0 0
原创粉丝点击