参考博客:http://www.cnblogs.com/bastard/archive/2012/05/19/2508913.html
http://blog.youkuaiyun.com/oldmtn/article/details/9214143
1.创建Android 工程,新建一个比如叫TestJNIMainActivity的类。
2.在TestJNIMainActivity定义如下方法:
package com.zhanghao.testjni;
import com.zhanghao.testjni.R;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.v("zhang", printJNI("I am HelloWorld Activity"));
}
static {
System.loadLibrary("HelloWorldJni");
}
private native String printJNI(String str);
}
3.通过run as Android Application 生成bin,我们从本地工程目录下bin/classes/可以看到MainActivity.class,通过命令javah com.zhang.testjni.MainActivity生成com_zhanghao_testjni_MainActivity.h文件如下所示
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_zhanghao_testjni_MainActivity */
#ifndef _Included_com_zhanghao_testjni_MainActivity
#define _Included_com_zhanghao_testjni_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
#undef com_zhanghao_testjni_MainActivity_MODE_PRIVATE
#define com_zhanghao_testjni_MainActivity_MODE_PRIVATE 0L
#undef com_zhanghao_testjni_MainActivity_MODE_WORLD_READABLE
#define com_zhanghao_testjni_MainActivity_MODE_WORLD_READABLE 1L
#undef com_zhanghao_testjni_MainActivity_MODE_WORLD_WRITEABLE
#define com_zhanghao_testjni_MainActivity_MODE_WORLD_WRITEABLE 2L
#undef com_zhanghao_testjni_MainActivity_MODE_APPEND
#define com_zhanghao_testjni_MainActivity_MODE_APPEND 32768L
#undef com_zhanghao_testjni_MainActivity_MODE_MULTI_PROCESS
#define com_zhanghao_testjni_MainActivity_MODE_MULTI_PROCESS 4L
#undef com_zhanghao_testjni_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING
#define com_zhanghao_testjni_MainActivity_MODE_ENABLE_WRITE_AHEAD_LOGGING 8L
#undef com_zhanghao_testjni_MainActivity_BIND_AUTO_CREATE
#define com_zhanghao_testjni_MainActivity_BIND_AUTO_CREATE 1L
#undef com_zhanghao_testjni_MainActivity_BIND_DEBUG_UNBIND
#define com_zhanghao_testjni_MainActivity_BIND_DEBUG_UNBIND 2L
#undef com_zhanghao_testjni_MainActivity_BIND_NOT_FOREGROUND
#define com_zhanghao_testjni_MainActivity_BIND_NOT_FOREGROUND 4L
#undef com_zhanghao_testjni_MainActivity_BIND_ABOVE_CLIENT
#define com_zhanghao_testjni_MainActivity_BIND_ABOVE_CLIENT 8L
#undef com_zhanghao_testjni_MainActivity_BIND_ALLOW_OOM_MANAGEMENT
#define com_zhanghao_testjni_MainActivity_BIND_ALLOW_OOM_MANAGEMENT 16L
#undef com_zhanghao_testjni_MainActivity_BIND_WAIVE_PRIORITY
#define com_zhanghao_testjni_MainActivity_BIND_WAIVE_PRIORITY 32L
#undef com_zhanghao_testjni_MainActivity_BIND_IMPORTANT
#define com_zhanghao_testjni_MainActivity_BIND_IMPORTANT 64L
#undef com_zhanghao_testjni_MainActivity_BIND_ADJUST_WITH_ACTIVITY
#define com_zhanghao_testjni_MainActivity_BIND_ADJUST_WITH_ACTIVITY 128L
#undef com_zhanghao_testjni_MainActivity_CONTEXT_INCLUDE_CODE
#define com_zhanghao_testjni_MainActivity_CONTEXT_INCLUDE_CODE 1L
#undef com_zhanghao_testjni_MainActivity_CONTEXT_IGNORE_SECURITY
#define com_zhanghao_testjni_MainActivity_CONTEXT_IGNORE_SECURITY 2L
#undef com_zhanghao_testjni_MainActivity_CONTEXT_RESTRICTED
#define com_zhanghao_testjni_MainActivity_CONTEXT_RESTRICTED 4L
#undef com_zhanghao_testjni_MainActivity_RESULT_CANCELED
#define com_zhanghao_testjni_MainActivity_RESULT_CANCELED 0L
#undef com_zhanghao_testjni_MainActivity_RESULT_OK
#define com_zhanghao_testjni_MainActivity_RESULT_OK -1L
#undef com_zhanghao_testjni_MainActivity_RESULT_FIRST_USER
#define com_zhanghao_testjni_MainActivity_RESULT_FIRST_USER 1L
#undef com_zhanghao_testjni_MainActivity_DEFAULT_KEYS_DISABLE
#define com_zhanghao_testjni_MainActivity_DEFAULT_KEYS_DISABLE 0L
#undef com_zhanghao_testjni_MainActivity_DEFAULT_KEYS_DIALER
#define com_zhanghao_testjni_MainActivity_DEFAULT_KEYS_DIALER 1L
#undef com_zhanghao_testjni_MainActivity_DEFAULT_KEYS_SHORTCUT
#define com_zhanghao_testjni_MainActivity_DEFAULT_KEYS_SHORTCUT 2L
#undef com_zhanghao_testjni_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL
#define com_zhanghao_testjni_MainActivity_DEFAULT_KEYS_SEARCH_LOCAL 3L
#undef com_zhanghao_testjni_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL
#define com_zhanghao_testjni_MainActivity_DEFAULT_KEYS_SEARCH_GLOBAL 4L
/*
* Class: com_zhanghao_testjni_MainActivity
* Method: printJNI
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_zhanghao_testjni_MainActivity_printJNI
(JNIEnv *, jobject, jstring);
#ifdef __cplusplus
}
#endif
#endif
</pre><pre>
注:如果出现了“错误:找不到android.app.Activity”这样的错误,可以使用javah -classpath bin/classes -bootclasspath E:\work\adt-bundle-windows-x86-20160418\adt-bundle-windows-x86-20131030\sdk\platforms\android-19\android.jar -d jni com.zhanghao.testjni.MainActivity
4.实现JNI原生函数源文件
新建com_zhanghao_testjni_MainActivity.c文件如下
#include <jni.h>
#define LOG_TAG "MainActivity"
#include <utils/Log.h>
JNIEXPORT jstring JNICALL Java_com_zhanghao_testjni_MainActivity_printJNI
(JNIEnv *env, jobject obj, jstring inputStr)
{
ALOGI("zhang Hello World From libahelloworld.so");
const char *str = (const char *)(*env)->GetStringUTFChars(env,inputStr,JNI_FALSE);
ALOGI("zhang ---->%s",(const char *)str);
(*env)->ReleaseStringUTFChars(env,inputStr,(const char *)str);
return (*env)->NewStringUTF(env,"Hello World! I am Native interface");
}
jint JNI_OnLoad(JavaVM* vm,void* reserved)
{
void *venv;
ALOGI("zhang ------> JNI_OnLoad!");
if((*vm)->GetEnv(vm,(void**)&venv,JNI_VERSION_1_4 != JNI_OK)){
ALOGE("zhang--->Error:GetEnv Failed");
return -1;
}
return JNI_VERSION_1_4;
}
5.在工程目录下如果没有jni文件夹,建立jni文件夹
编译生成so库
编译com_lucyfyr_HelloWorld.c成so库可以和app一起编译,也可以都单独编译。
在当前目录下建立jni文件夹:HelloWorld/jni/
下建立Android.mk ,并将com_lucyfyr_HelloWorld.c和 com_lucyfyr_HelloWorld.h 拷贝到进去
编写编译生成so库的Android.mk文件:
LOCAL_PATH:= $(call my-dir)
# 一个完整模块编译
include $(CLEAR_VARS)
LOCAL_SRC_FILES:=com_zhanghao_testjni_MainActivity.c
LOCAL_C_INCLUDES := $(JNI_H_INCLUDE)
LOCAL_MODULE := libHelloWorldJni
LOCAL_SHARED_LIBRARIES :=liblog libutils
LOCAL_PRELINK_MODULE := false
LOCAL_MODULE_TAGS :=optional
include $(BUILD_SHARED_LIBRARY)
编译此模块 mmm packages/apps/TestJNI/jni/ ,system/lib/会生成libHelloWorldJni.so
将libHelloWorldJni.so push到手机的system/lib/下,然后打开安装好的APK,在命令行执行
1、adb shell
2、logcat | grep zhang
以上就是我的测试结果,小伙伴们可以自己试试啦。