本人是Android开发者,因为想学习NDK,然后开始倒腾学习一下JNI的语法。
PC环境: Mac
软件: IntelliJ IDEA 2018.1.3 + CLion2018.1.5
一、创建一个Java项目TestJniExample
创建一个Java命令行项目,然后写个简单的本地测试方法。
public class TestJni {
static {
System.loadLibrary("test");
}
public native String getStringFromNative();
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
二、得到字节码文件
直接点击绿色小按钮运行一下,可以在out/production/TestJniExample
目录下得到TestJni.class
文件。
cd
到out/production/TestJniExample
目录下,然后执行命令javah TestJni
,就会得到一个TestJni.h
文件。
三、新建CLion项目
新建一个CLion项目,将前面生成的TestJni.h
拷贝到项目中,
然后将Java目录下的jni.h
和jni_md.h
文件拷贝至CLion项目里。
Mac平台下,点击Finder应用,快捷键
Command + Shift + G
输入/Library/java
点击回车键就能找到Java的Home目录了,前提是你没有人工修改Java的默认安装路径。
拷贝后将TestJni.h
文件中的#include <jni.h>
改成#include "jni.h"
四、实现jni方法
创建TestJni.c
文件,将TestJni.h
中的函数头拷贝进来,函数中添加具体的参数名称,写一个简单的返回值,这样子我们本地文件就创建好了。
#include "TestJni.h"
#include "jni.h"
JNIEXPORT jstring JNICALL Java_TestJni_getStringFromNative
(JNIEnv *env, jobject object){
return (*env) ->NewStringUTF(env,"我来自本地");
}
如果出现
Clion this file does not belong to any project target
可以参考
https://blog.csdn.net/appleyuchi/article/details/77804114处理一下。
五、打包一个so文件
我这边是用Xcode上的gcc,如果没有装Xcode,那么下载安装配置一下gcc。
命令行中输入
gcc TestJni.c -fPIC -shared -o libtest.so
或者
gcc -dynamiclib -I . TestJni.c -o libtest2.so
都能够生成libtest.so
文件
六、将生成的so文件加载进java
这边我遇到点麻烦,就是
System.loadLibrary("test")
会报错
所以我采取的是写了绝对路径,加载这个库。如果有朋友有什么好方法可以告诉我一下,谢谢。
static {
// System.loadLibrary("test");
System.load("/Users/****/code/java/jni/JniExample/libtest.so");
}
然后Run一下,在IntellJ IDEA的控制台中就出现了本地方法返回的结果了。
参考:https://blog.csdn.net/liangjiu2009/article/details/77063704
网友评论