忽然想给SnakeGo加段'高大上'的代码 -- 使用JNI调用.so的Native函数...(似乎完全不需要...)
工作中一直在用Native方式, 但只是改改C/C++, 再改改Java, 然后通过Maven把一切都搞定了, 想想自己应该一直都是纸上谈兵, 完全没敲过, 于是敲下, 留贴记录.
1. 创建个Android的app工程, 带个默认的MainActivity类;
2. 在类中添加个Native函数;
public class MainActivity extends Activity { public native int getNumber(int i);}
3. 通过javah生存JNI接口文件;
>javah -classpath "JNITest\bin\classes";"sdk\platforms\android-19\android.jar" -o JNITest.h jie.android.jnitest.MainActivity
/* * Class: jie_android_jnitest_MainActivity * Method: getNumber * Signature: (I)I */JNIEXPORT jint JNICALL Java_jie_android_jnitest_MainActivity_getNumber(JNIEnv *, jobject, jint);
4. 创建相应的C源文件;
#include#include "include/JNITest.h"JNIEXPORT jint JNICALL Java_jie_android_jnitest_MainActivity_getNumber(JNIEnv *env, jobject obj, jint value){ return (value + 10);}
5. 编写默认makefile文件Android.mk
LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := JNITestLOCAL_SRC_FILES := JNITest.c empty.cinclude $(BUILD_SHARED_LIBRARY)
6. 使用ndk编译;
D:\Studio\GIT_ROOT\JNITest\jni>ndk-build cleanClean: JNITest [armeabi]Clean: stdc++ [armeabi]D:\Studio\GIT_ROOT\JNITest\jni>ndk-build"Compile thumb : JNITest_lib <= JNITest.c"Compile thumb : JNITest_lib <= empty.cSharedLibrary : libJNITest.soInstall : libJNITest_lib.so => libs/armeabi/libJNITest.so
7. Java中加载.so及调用;
static { System.loadLibrary("JNITest");}
TextView tv = (TextView)MainActivity.this.findViewById(R.id.textView1);tv.setText("i = " + getNumber(2));
一气敲完, 运行正常...但每次都要这样一步一步的自己完成这些固定步骤吗? 该有啥方便的法子, 我去Google下了..