NDK与JNI
JNI提供java到native层的调用方式,我们可以用NDK工具来编译C语言的代码生成Linux平台下的动态链接库(.so)以供使用。
我将大致开发步骤记录一下,以备以后回顾。
环境
* mac os
* AdnroidStudio
* ndk-bundle
步骤
1.JAVA类
先计划好你将会在native层调用到的函数,写一个Java类封装起来。
例如:
public class HelloNative {
public String getString(){
return getStringFromJNI();
}
private native String getStringFromJNI();
}
2.生成对C代码中需要的头文件
这是JDK提供生成方式,如果想可以自己写。在main目录下新建一个目录jni,打开Terminal,进入java文件所在目录,先编译一下Java文件,确保没有什么低级错误。
javac -d ../jni ./com/compilesense/liuyi/hellondk/HelloNative.java
生成头文件。
javah -d ../jni com.compilesense.liuyi.hellondk.HelloNative
3.编写c语言代码
就在jni目录下新建一个c文件吧。
#include <com_compilesense_liuyi_hellondk_HelloNative.h>
JNIEXPORT jstring JNICALL Java_com_compilesense_liuyi_hellondk_HelloNative_getStringFromJNI(JNIEnv * jenv, jobject job){
retrun (*jenv)->NewStringUTF(jenv,"native say hello to java");
}
4.编写Android.mk文件
同样的在jni目录下新建 Android.mk文件。最简单情况下只写Android.mk就行了,Application.mk可以进行更多的配置,例如生成指定硬件平台的库文件。
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := HelloNative.c //源文件
LOCAL_C_INCLUDES += $(LOCAL_PATH) //头文件位置
LOCAL_MODULE = hello_native //输出的so文件的名字
include $(BUILD_SHARED_LIBRARY)//生成动态链接库
5.使用ndk编译生成动态链接库
进入jni目录,执行编译命令。
ndk-build
这样就会生成各个平台的.so文件了。
6.执行下native程序
在main目录下新建jniLibs目录,将生成的libs里的库按需要拷贝到jniLibs中,将jni目录重命名为其他名字,以免编译报错。
然后在java中加载库并执行。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
System.loadLibrary("hello_native");
Log.d("MainActivity",new HelloNative().getString());
}
}
然后编译执行,可以在LogCat中看到: