[url=http://xiazai.jb51.net/201305/yuanma/genjni.zip][b]这里下载[/b][/url]>这个小工具。解压后有三个文件一个是Java源码,一个是Jar包(genjni.jar),一个是Shell脚本(genjni.sh)。放上源码的原因是,如果有兴趣的朋友可以进行改进,但是改进后请
发我一份。下载后,最好修改下Shell脚本,把Jar文件的路径改成具体的存放路径,否则会报出找不到Jar文件的错误。最后把genjni.sh放到~/bin下面,为了使用时方便。使用的时候要在Android项目的根目录下面运行genjni.sh就可以了。
[b]下面以一个实例方式演示下这个小工具的使用方法:
[/b]创建一个项目叫HelloJni,并创建一个HelloJniActivity,在其内声明一个本地方法getStringFromJni();并用有一个TextView用来显示getStringFromJni()返回的信息。另一个本地方法getStatusFromJni(int)是为了显示用的,没有使用。这是Java代码:
package com.hilton.hellojni;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloJniActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView text = (TextView) findViewById(R.id.text);
text.setText(getStringFromJni());
}
private native String getStringFromJni();
private native int getStatusFromJni(int type);
}
写好Java代码后,从终端进入到项目的根目录下
$cd HelloJni
$ls
AndroidManifest.xml assets bin default.properties gen proguard.cfg res src
$genjni.sh
appplication HelloJni
package name: com.hilton.hellojni
class name: HelloJniActivity
$ls
AndroidManifest.xml assets bin default.properties gen jni proguard.cfg res src
$ls jni
Android.mk HelloJniActivity.c
打开查看Android.mk和HelloJniActivity.c
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := HelloJni
LOCAL_SRC_FILES := HelloJniActivity.c
include $(BUILD_SHARED_LIBRARY)
#include <jni.h>
jstring Java_com_hilton_hellojni_HelloJniActivity_getStringFromJni(JNIEnv* env, jobject thiz) {
}
jint Java_com_hilton_hellojni_HelloJniActivity_getStatusFromJni(JNIEnv* env, jobject thiz, jint type) {
}
再查看HelloJniActivity.java也被更新了,里面多了加载共享库的语句:
package com.hilton.hellojni;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class HelloJniActivity extends Activity {
static {
System.loadLibrary("HelloJni");
}
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView text = (TextView) findViewById(R.id.text);
text.setText(getStringFromJni());
}
private native String getStringFromJni();
private native int getStatusFromJni(int type);
}
[b]剩下的工作就是实现本地方法了。
[/b]当然这个工具还是有很多问题,欢迎各位反馈,或给出改进意见。
另外,这个工具是用Java写的,更好的选择应该是用脚本来写,如Perl或Python。还有就是,如果能把这个工具集成到ADT中,或是创造一个完全用于NDK开发的集成工具ANDT,能够像产生R.java那样的自动生成本地文件。比如做一个ANDT工具,集成到Eclipse中,能够自动当Java中有本地方法声明后就自动生成本地文件和编译文件。这将是多么美好的事情啊,将对NDK的开发有重大的帮助。我想,Google应该会做一专门用于NDK开发的Eclipse插件,或是在ADT中加入对NDK的支持,因为NDK开放的接口越来越多,使用NDK开发者也将越来越多,基于NDK开发的应用也将越来越多(2.3及以后的版本,完全可以只用NDK开发出一个Apk,也就是说用纯C/C++来开发应用)。希望这一天早些到来。