JNI在Java高版本的使用
开发工具:Android Studio
- 新建一个项目命名JNI,在MainActivity.java文件中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = (TextView) findViewById(R.id.text);
NativeMethod nm = new NativeMethod();//调用native方法就ok了
textView.setText(nm.stringFromJNI());
}
- 创建NativeMethod.java,如下:
public class NativeMethod {
static {
System.loadLibrary("jni");
}
public native String stringFromJNI();
}
- 在NativeMethod.java所在目录下,打开cmd并运行:
javac NativeMethod.java //生成NativeMethod.class文件
- 然后Java在jdk10以后弃用javah命令,而采用javac –h代替。所以该处使用命令:
javac -h ./ NativeMethod.java
会在当前目录下生成com_toptech_jni_NativeMethod.h文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_toptech_jni_NativeMethod */
#ifndef _Included_com_toptech_jni_NativeMethod
#define _Included_com_toptech_jni_NativeMethod
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_toptech_jni_NativeMethod
* Method: stringFromJNI
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_toptech_jni_NativeMethod_stringFromJNI
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
按照这个文件部分命名格式我们在项目的app目录下新建jni目录并在其中创建com_toptech_jni_NativeMethod.c文件
#include <string.h>
#include <jni.h>/*必须要的*/
JNIEXPORT jstring JNICALL Java_com_toptech_jni_NativeMethod_stringFromJNI(JNIEnv* env,
jobject thiz )/*注意拷贝过来的参数*/
{
return (*env)->NewStringUTF(env, "Hello Test NDK !");
}
同时在该目录下,创建Android.mk文件:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jni //要生成的so库的名称,但实际为libjni.so
LOCAL_SRC_FILES := com_toptech_jni_NativeMethod.c //要使用的文件,刚才编写的.c文件
include $(BUILD_SHARED_LIBRARY)
-
在Android Studio打开SDK Mannger下载NDK(大约1G)
-
在下载完成后打开Project Structure设置NDK路径(AppData不可见的话记得在文件资源管理器里点击查看勾选隐藏的项目)
-
同时也将NDK(类似上图路径)添加到系统环境变量中(不懂自行百度)。
-
配置完成后在cmd下进入到项目的app目录下,然后输入ndk-build命令生成so动态库文件,成功后在项目的linbs下会有新的文件。
-
然后在app的build.gradle的android节点下设置:
(不加这行代码,运行程序会出现couldn’t find "libjni.so错误) -
最后回到NativeMethod.java文件中,这时你加载的类库才会起作用,注意箭头所指的的名字就是你在Android.mk文件中要生成so库的名称
-
运行程序可看到打印结果