使用JNI呼叫C程式碼
阿新 • • 發佈:2021-04-27
文章目錄
一、JniUtils
class JniUtils {
static {
//名字必須和build.gradle中的moduleName一致
System.loadLibrary("jni-demo");
}
public static native String getStringFromC();
public static native int add(int a ,int b);
}
- 進入app/build/intermediates/javac/debug/classes目錄下
javah -jni com.meta.jnidemo.JniUtils
- 在jnidemo目錄下,會生成JniUtils.class對應的.h檔案
- 將.h檔案複製到jni目錄下
二、其餘部分
- etheValue_jni.c
// 自己建立一個c檔案,實現自己定義的native方法,也就是.h檔案中的方法 / /引入自己生成的.h標頭檔案 #include <com_meta_jnidemo_JniUtils.h> #include <jni.h> //返回一個字串 JNIEXPORT jstring JNICALL Java_com_meta_jnidemo_JniUtils_getStringFromC (JNIEnv *env, jclass jobj) { return (*env)->NewStringUTF(env,"HelloWorld tmj"); } //返回 a+b的結果 JNIEXPORT jint JNICALL Java_com_meta_jnidemo_JniUtils_add (JNIEnv *env, jclass jobj, jint a, jint b){ return a+b; }
- MainActivity
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val tv = findViewById<View>(R.id.tv) as TextView tv.text = JniUtils.getStringFromC() } }
- build.gradle
android {
...
defaultConfig {
...
ndk {
moduleName "jni-demo"//指定生成的so檔名
}
}
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}
...
}
- Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := jni-demo
LOCAL_SRC_FILES := etheValue_jni.c
include $(BUILD_SHARED_LIBRARY)
- rebuild過後就可以在app/build/intermediates/ndkBuild目錄下看到so庫