JNI入门探索


参考博客: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.cso库可以和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


以上就是我的测试结果,小伙伴们可以自己试试啦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值