JNI
原文地址:超级简单的Android Studio jni 实现(无需命令行)
1、生成.h文件
Program: JDKPath J D K P a t h \bin\javah.exe
Parameters:-classpath . -jni -d ModuleFileDir M o d u l e F i l e D i r \src\main\jni FileClass F i l e C l a s s
Working directory: ModuleFileDir M o d u l e F i l e D i r \src\main\Java
注释:
-classpath classes 指明类所在的位置
-jni com.jni.jnitest.JNITest 类的绝对路径
-d 产生的.h文件放到指定目录下;
随便写个类调用一下JNI接口
public class JNITest {
static {
System.loadLibrary("JniLib");
}
public native String getString();
}
右键上面写的类,右键 src->New->Folder->JNI Folder
会在jni文件夹下面生成.h文件夹。
2、创建文件 JniLib.cpp 、Android.mk、Application.mk
首先:创建jni文件夹
右键 src->New->Folder->JNI Folder
然后:在jni目录下分别创建并编写 JniLib.cpp、Android.mk、Application.mk
这三个文件
JniLib.cpp
复制刚刚创建的.h文件内容到
JniLib.cpp
并修改,如下(此文件为JNI内容文件):
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <com_ynh_mediaclient_mediaclient_JNITest.h>
/* Header for class com_jni_jnitest_JNITest */
/*
* Class: com_jni_jnitest_JNITest
* Method: getString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL
Java_com_ynh_mediaclient_mediaclient_JNITest_getString //这里是路径
(JNIEnv * env, jobject jobject)
{
return (*env).NewStringUTF("成功调用JNI内容");
}
Android.mk
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := JniLib LOCAL_SRC_FILES =: JniLib.cpp include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_MODULES := JniLib //生成的so的名字 - 可以有很多个so APP_ABI := all //生成什么平台的so.
总共四个文件
3.其他配置
1.修改app下的 build.gradle文件, 如下
ndk{
moduleName "JniLib"
// abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定的三种abi体系下的so库
}
sourceSets.main{
jni.srcDirs = []
jniLibs.srcDir "src/main/libs"
}
2.项目下的gradle.properties文件(如果没有此文件,自己新建一个)添加代码:
android.useDeprecatedNdk=true
4、执行ndk-build
用的是配置好的工具来执行,和第一步一样的条件
选中JNI类右键->New->External Tools->ndk-build,然后就成功了。
5、调用so
写个类测试一下:
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
Button button;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button) findViewById(R.id.button);
tv=(TextView) findViewById(R.id.tv);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
tv.setText("结果:"+ new JNITest().getString());
}
});
}
}
}
效果图: