SnakeGo : JNI, Android.mk and ndk-build

 

    忽然想给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下了..

 

posted on 2014-06-08 22:17  codejie  阅读(334)  评论(0编辑  收藏  举报

导航