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了,我的运行结果