java调用C步骤
第一步,写java代码,,写一个natvie方法
public native String getServerInfo(String path);
第二步。创建jni目录,在目录中创建test.c文件,同时将jni.h文件 放入jni目录
写c代码,注意方法名,并且引入jni.h
#include <jni.h>
#include <stdio.h>
jstring Java_com_example_untitled_MyActivity_getServerInfo(JNIEnv* env, jobject thiz, jstring path) {
写方法。。。
}
注意:方法名的写法如下
Java_包名_类型_方法名(jvm虚拟机的指针,调用者对象)
这里生成方法名也可以通过ndk来实现的分为2步
* 通过dos命令使用javac -d . Test.java 命令编译带有native方法的.java文件,这样就会在当前目录中生成一个class文件
会生成com/b3a4a/jnitest/Test.class
* 通过javah命令来生成 例如 javah com.b3a4a.jnitest.Test,会生成.h的头文件
生成 com_b3a4a_jnitest_Test.h 文件,方法名就在.h头文件中
JNIEXPORT jstring JNICALL Java_com_b3a4a_jnitest_Test_getServerInfo
(JNIEnv *, jobject);
第三步,在jni目录中创建文件,andorid.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := test
LOCAL_SRC_FILES := test.c
LOCAL_C_INCLUDES := $(LOCAL_PATH)/include
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
include $(BUILD_SHARED_LIBRARY)
第四步,进入命令行,进入应用程序的包的目录,执行ndk-build命令,创建Application.mk,自己填写需要的处理器型号,生成不同的so文件
APP_ABI := armeabi armeabi-v7a x86
第五步,将生成的libtest.so 放入lib/armeabi目录(目录不需要自己建)
第六步,java代码里面,把动态链接库加载到jvm虚拟机
static{
System.loadLibrary("库文件名称不带前缀,后缀名");
}
第7步,java中直接调用native方法
JNI开发的常见错误
1. 写错了load的library
java.lang.UnsatisfiedLinkError: Couldn't load hell0: findLibrary returned null
2. Android.mk文件编写错误
/jni/Android.mk:4: *** missing separator. Stop.
3. LOCAL_MODULE配置不能有扩展名
//jni/Android.mk:hello.so: LOCAL_MODULE_FILENAME must not contain a file extension
4. c或者c++的源文件名称配置错误
objs/hello/helo.o'. Stop.
5. 如果使用了错误的cpu平台
java.lang.UnsatisfiedLinkError: Couldn't load hello: findLibrary returned null
添加多cpu平台的支持 APP_ABI := armeabi armeabi-v7a x86
6. c语言方法名称错误,导致java代码无法寻找到c代码
Caused by: java.lang.UnsatisfiedLinkError: Native method not found: com.itheima.hellojni.MainActivity.helloFromC:()Ljava/lang/String;
7. 应用程序闪退
06-25 07:31:46.698: I/dalvikvm(1871): #00 pc 0008ee6d /system/lib/libdvm.so
06-25 07:31:46.698: I/dalvikvm(1871): #01 pc 000738ca /system/lib/libdvm.so
06-25 07:31:46.698: I/dalvikvm(1871): #02 pc 000739f4 /system/lib/libdvm.so
06-25 07:31:46.698: I/dalvikvm(1871): #03 pc 00038f5b /system/lib/libdvm.so
06-25 07:31:46.698: I/dalvikvm(1871): #04 pc 0003bdbd /system/lib/libdvm.so
要么就是c代码有逻辑错误
要么编码问题,中文或者空格路径
|
|