當前環境:
android studio 3.0.0
android-ndk版本:
1、創建android項目 (JNIDemo)
2、創建jni文件夾
右鍵 src->New->Folder->JNI Folder 如圖:
結果如圖:
3、創建JNI類
public class JNITest {
static {
System.loadLibrary("JniLib");
}
public native String getString();
}
如圖:
3.1生成.h文件
3.1.1方法一
配置 Anroid Studio 外部工具,一勞永逸,往後無需命令行,File->Setting->Tools->External Tools->“+”進入頁面
Program:$JDKPath$\bin\javah.exe
Parameters:-classpath . -jni -d $ModuleFileDir$\src\main\jni $FileClass$
Working directory:$ModuleFileDir$\src\main\Java
註釋:
-classpath classes 指明類所在的位置
-jni com.jni.jnitest.JNITest 類的絕對路徑
-d 產生的.h文件放到指定目錄下;
配置成功如圖:
開始生成.h文件,選中JNI類右鍵->New->External Tools->javah,如圖:
成功後如圖:
3.1.2方法二
右鍵拖動JNI類所在的包的路徑到Terminal,自動切換到該目錄下
javac編譯生成class文件(生成class文件的方法有很多,這裏提供一種)
右鍵拖動java文件夾到Terminal,自動切換到該目錄下
必須在包名外使用javah命令,編譯生成.h文件,把.h文件移動到jni文件夾(生成.h文件後可以刪除class文件)如圖:
3.2、創建文件 JniLib.cpp 、Android.mk、Application.mk
在jni目錄下分別創建並編寫 JniLib.cpp、Android.mk、Application.mk 這三個文件
複製.h文件內容到JniLib.cpp並修改,如下(此文件爲JNI內容文件):
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <com_jni_jnitest_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_jni_jnitest_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
APP_ABI := all
4、其它相關配置
4.1 修改app下的build.gradle文件, 如下圖
ndk{
moduleName "JniLib"
// abiFilters "armeabi", "armeabi-v7a", "x86" //輸出指定的三種abi體系下的so庫
}
sourceSets.main{
jni.srcDirs = []
jniLibs.srcDir "src/main/libs"
}
4.2 項目下的gradle.properties文件(如果沒有此文件,自己新建一個)添加代碼:
android.useDeprecatedNdk=true
5、執行ndk-build
此處我用的是配置好的工具來執行,和 3.1.1 一樣的步驟
選中JNI類右鍵->New->External Tools->ndk-build,結果如圖:
6、調用so
package com.jni.jnitest;
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 = findViewById(R.id.button);
tv = findViewById(R.id.tv);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
tv.setText("結果:"+ new JNITest().getString());
}
});
}
}
結果
---------------------
作者:張Ning
來源:CSDN
原文:https://blog.csdn.net/ziyoutiankoong/article/details/79696279
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!