1. 程式人生 > 其它 >使用JNI呼叫C程式碼

使用JNI呼叫C程式碼

文章目錄

一、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庫
    在這裡插入圖片描述