JNI 调用的步骤

1、声明native 方法

// 1\声明一个native 方法 该方法用于调用C代码中的函数 
public native String helloJni();

2、在android项目中创建jni文件夹,并添加c文件

3、在C文件中,声明与native 方法对应的C函数

/**Eclipse找到src文件夹(Studio找到java文件夹),使用Javah 包名.类名命令可以直接生成对应的C函数
 * 返回值:jstring 对应java当中的String 类
 * 方法名:Java_包名_类名_方法名
 * 参数一:JNIEnv* env  java虚拟机的运行环境
 * 参数二:jobject obj  调用该方法的java对象,在下面的代码中obj是MainActivity
 */

结构类型如:jstring Java_com_itcast_hello_jni_MainActivity_helloJni(JNIEnv* env,jobject obj){}

4、添加C代码,并返回对应的值

const char* pstr= "hello from c";
//(**env).NewStringUTF(env,pstr);
return (*env)->NewStringUTF(env,pstr);

5、添加Android.mk 配置文件:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := hello  # 要编译的模块的名称
LOCAL_SRC_FILES := hello.c  # 该模块对应的源文件,如果有多个文件,以空格分隔
include $(BUILD_SHARED_LIBRARY)


* 上面的配置只会生成arm处理器的so库
* 如果想要生成所有的处理器的so库,要创建Application.mk配置文件,加上下面这句话:

APP_ABI := all

6、将C文件编译为so 动库联接库(必须以管理员权限运行命令提示符窗口)

打开jni文件夹,所在的目录,执行ndk-build命令编译。 1、 将ndk的路径添加至系统path 环境变量 2、 注意编译时,C代码中,应 #include

7、在java文件中,添加so库文件,添加静态代码块

static{
    System.loadLibrary("hello");
}

8、注意

* 静态代码块中System.loadLibrary("hello");的名字和创建的C文件名一致。
* LOCAL_MODULE := hello # 要编译的模块的名称,和创建的C文件名一致。
* LOCALSRCFILES := hello.c # 该模块对应的源文件,和创建的C文件名一致;如果有多个文,以空格分隔

======================================================

JNI的常见问题

1、so文件与当前的平台不相符合

异常信息: : Caused by: java.lang.UnsatisfiedLinkError: Couldn’t load hello: findLibrary returned null * 解决方法: * 在jni目录中添加文件 Application.mk * APP_ABI := all

2、 加载的库与SO 文件名不符合

异常信息: : Caused by: java.lang.UnsatisfiedLinkError: Couldn’t load hello: findLibrary returned null 解决方法的对应代码: so 文件名:libhellondk.so 加载库的代码: static{ System.loadLibrary(“hellondk”); }

3、C函数的名称与native方法的名称不匹配

如果手工书写的时候,有可能会写错,建议,都用javaH 命令来生成native方法对应的C的函数名称
找到src文件夹,使用Javah 包名.类名;然后会生成一个如名为: com_example_jni2_MainActivity.h;的文件,打开复制
java 代码调用C代码传参时的原则C代码中调用java代码中的方法的步骤
获得字节码: 获得方法:参数一:运行环境, 上面获取的字节码, 方法的名称, 方法的签名(javap —s获取) 在项目的bin/classes中点击右键,打开命令行,输入javap —s命令,可以获取到方法的签名。
C代码字符串转换成java代码字符串: (*env)->NewStringUTF(env,CString);//参数为:环境/C代码字符串

kiss keep it simple stupid

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaopihair123/article/details/53233127
文章标签: android
个人分类: Android
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭