忽然想给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 <jni.h> #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 := JNITest LOCAL_SRC_FILES := JNITest.c empty.c include $(BUILD_SHARED_LIBRARY)
6. 使用ndk编译;
D:\Studio\GIT_ROOT\JNITest\jni>ndk-build clean Clean: JNITest [armeabi] Clean: stdc++ [armeabi] D:\Studio\GIT_ROOT\JNITest\jni>ndk-build "Compile thumb : JNITest_lib <= JNITest.c "Compile thumb : JNITest_lib <= empty.c SharedLibrary : libJNITest.so Install : 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下了..