Android JNI之動態創建native
1、環境配置
1)確定android studio裏安裝了ndk,可以按照下面的圖查看。
2)系統環境變量配置,根據自己電腦路徑配置
2、動態創建native
1)新建一個android studio工程,然後在gradle.properties裏增加如下語句。
2)在MainActivity平級目錄下新建一java文件,內容如下:
package com.example.myjnidemotest2;
public class JniUtils {
static{
System.loadLibrary("native-lib");
}
public static native String getStringFromJni();
public static native int getAddResultFromJni(int a, int b);
}
3) 在main下面新建jni目錄
4)在jni目錄下新建三個文件,一個cpp文件,兩個mk文件。 cpp文件是實現具體功能的,是用C++實現的。
cpp文件內容
#include <jni.h>
#include <stdio.h>
#include<android/log.h>
#include <stdlib.h>
using namespace std;
#ifdef __cplusplus
extern "C" {
#endif
static const char *className = "com/example/myjnidemotest2/JniUtils";
JNIEXPORT jstring JNICALL JniSay(JNIEnv *env, jobject obj) {
return env->NewStringUTF("Hello From JNI!!!");
}
JNIEXPORT jint JNICALL addInJni(JNIEnv *env, jobject obj, jint a, jint b) {
return a + b;
}
static JNINativeMethod gJni_Methods_table[] = {
{"getStringFromJni", "()Ljava/lang/String;", (void*)JniSay},
{"getAddResultFromJni", "(II)I", (void*)addInJni},
};
JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved){
JNIEnv* env = NULL;
jint result = -1;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
return result;
}
jclass clazz = (env)->FindClass( className);
if (clazz == NULL){
return -1;
}
if ((env)->RegisterNatives(clazz, gJni_Methods_table, sizeof(gJni_Methods_table) / sizeof(gJni_Methods_table[0])) < 0)
{
return -1;
}
return JNI_VERSION_1_4;
}
#ifdef __cplusplus
}
#endif
Android.mk文件內容
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := native-lib
LOCAL_SRC_FILES := ImplementFuns.cpp
include $(BUILD_SHARED_LIBRARY)
Application.mk文件內容
APP_ABI := all
5)在app的build.gradle裏增加如下內容
6)調用JNI接口,我是在MainActivity裏調用的。
package com.example.myjnidemotest2;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("wujiang", "from jni str = " + JniUtils.getStringFromJni());
Log.d("wujiang", "a + b = " + JniUtils.getAddResultFromJni(4, 9));
}
}
7)編譯運行就ok了,我的運行結果