没有为什么,就是在项目中有用到JNI,由于现在项目用到的.so文件是别人写的现成的,没法改,所以,就打算自己来一个。但是网上教程很不全呀。自己动手,丰衣足食!
一: 准备工作
下载NDK:http://dl.google.com/android/repository/android-ndk-r12b-windows-x86_64.zip
二:环境配置
1.eclipse关联NDK
2.配置项目NDK的Builder,方便随时动态生成.so文件。 “我的项目”——“properties“——“builders”——“new”——“program“ Location: working directory:3.给项目确定生成.so文件的文件名
“我的项目”——“android tool”——“add native support” 这一步以后,在项目根目录下就可以找到JNI目录了(仅仅框框中的两个文件的)三:android中调用.so文件
android主文件中:
HelloWorld.javapackage com.shone.testjni;import android.app.Activity;import android.os.Bundle;import android.widget.TextView;public class HelloWorld extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView mTv = (TextView) findViewById(R.id.tv); int c = printJNI(1, 13); mTv.setText(c + ""); } static { // 加载库文件 System.loadLibrary("TestJni"); } // 声明原生函数 参数为String类型 返回类型为String private native int printJNI(int a, int b);}
activity_main.xml
那么接下来,就是生成cpp文件了。
由于其他地方有很多坑,我就不描述了,直接上正确的。 cmd下,切换到项目src目录javah -d jni com.shone.testjni.HelloWorld
然后就可以跑到src目录下,找到jni目录,把里面的文件拷贝出来。放到eclipse项目的jni目录下
com_shone_testjni_HelloWorld.h/* DO NOT EDIT THIS FILE - it is machine generated */#include/* Header for class com_shone_testjni_HelloWorld */#ifndef _Included_com_shone_testjni_HelloWorld#define _Included_com_shone_testjni_HelloWorld#ifdef __cplusplusextern "C" {#endif/* * Class: com_shone_testjni_HelloWorld * Method: printJNI * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_shone_testjni_HelloWorld_printJNI (JNIEnv *, jobject, jint, jint);#ifdef __cplusplus}#endif#endif
TestJni.cpp文件
#includeextern "C" {jint Java_com_shone_testjni_HelloWorld_printJNI(JNIEnv *, jobject thiz , jint a, jint b){ return a+b;}}
android.mk
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := TestJniLOCAL_SRC_FILES := TestJni.cppinclude $(BUILD_SHARED_LIBRARY)
生成.so
这个时候,刷新一下项目就可以生成.so文件了
这个时候,如果想启动项目是不行的,报错。 还是“我的项目”——“android tool”——“clear link marker” 就可以启动项目了 当然,也可以把jni目录直接删除了。然后项目就不报错了。可以直接启动了看看效果吧:
文章参考:
Demo下载: