JNI中包括java和c两部分
这2部分虽然不是完全独立,但可以分开实现
java部分
1、载入动态库
static {
System.loadLibrary("jni");
}
//注意这个字符串,如果这个字符串是 xx 那么c那边要生成的库文件名要对应是 libxx.so
2、声明native 方法
native public String getJni();
//其中方法名也要注意 和 c部分对应(与gMethods中的字符串对应)
java部分比较简单 只要注意字符串的对应就可以了
//~~~~~~~~~~~~~~~~~~NativeDynamic.java
package com.karl.jni;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class NativeDynamic extends Activity {
static {
System.loadLibrary("jni");
}
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
native public String getJni();
public void getDynamic(View view) {
Toast.makeText(this, getJni(), Toast.LENGTH_SHORT).show();
}
}
C部分
一、代码
1、JNI载入的入口函数----JNI_OnLoad 其中调用了注册方法函数
2、注册方法函数---registerMethods 主要注意类名字符串的匹配 其中调用了 方法函数
3、方法函数----gMethods 类似map的一个对应函数 把java和c的函数配对 注意方法名的字符串匹配
二、编译
Android.mk文件
LOCAL_PRELINK_MODULE = false 这个要注意
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~jni.cpp
#define LOG_TAG "NativeDynamicLibrary"
#include "utils/Log.h"
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <assert.h>
#include "jni.h"
static jstring Get_Jni(JNIEnv* env, jclass clazz) {
return env->NewStringUTF("string from get_jni");
}
static const JNINativeMethod gMethods[] = {
{ "getJni", "()Ljava/lang/String;",
(void*)Get_Jni },
};
static int registerMethods(JNIEnv* env) {
static const char* const kClassName =
"com/karl/jni/NativeDynamic";
jclass clazz;
/* look up the class */
clazz = env->FindClass(kClassName);
if (clazz == NULL) {
LOGE("Can't find class %s/n", kClassName);
return -1;
}
/* register all the methods */
if (env->RegisterNatives(clazz, gMethods,
sizeof(gMethods) / sizeof(gMethods[0])) != JNI_OK)
{
LOGE("Failed registering methods for %s/n", kClassName);
return -1;
}
return JNI_TRUE;
}
jint JNI_OnLoad(JavaVM* vm, void* reserved) {
JNIEnv* env = NULL;
jint result = -1;
if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
LOGE("ERROR: GetEnv failed/n");
goto bail;
}
assert(env != NULL);
if (registerMethods(env) != JNI_TRUE) {
LOGE("ERROR:native registration failed/n");
goto bail;
}
/* success -- return valid version number */
result = JNI_VERSION_1_4;
bail:
return result;
}
//~~~~~~~~~~~~~~~~Android.mk
LOCAL_PATH:= $(call my-dir)
#----------------------------------------------------------------------
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE := libjni
LOCAL_SRC_FILES := /
jni.cpp
LOCAL_SHARED_LIBRARIES := /
libandroid_runtime /
libnativehelper /
libcutils /
libutils
LOCAL_C_INCLUDES += /
$(JNI_H_INCLUDE) /
$(LOCAL_PATH)/../include
LOCAL_CFLAGS += /
-O
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)
//~~~~~~~~~~~~~~~~~~~~~make -j 8 libjni 这样就可以生成对应的libjni.so 文件
//然后把libjni.so 文件 push到system/lib目录下
运行apk文件就可以了