Android中的JNI
JNI就是java的本地调用,调用本地用C、C++实现的接口,使用环境是Eclipse and ubuntu 10.10;实现方法步骤是:
1. 新建Android Project ;
2. 然后在实现了该有的方法以外,还要声明本地调用的方法,使用关机字native声明,并且只是声明没有实现,如:
public static native String return_string();
3. 写好Android代码以后进行编译生成.class文件;
4. 使用java的javah命令生成.h文件,由于在Android中生成有点特别,需要转到src目录下才能生成;
如:cd workspace/JNItest/src
Javah com.example.jnitest.MainActivity 之后就生成了.h文件了,如:
5. 编写本地实现部分,也就是.c or .cpp文件,并且在其中是方法内容,如:
#include <string.h>
#include <jni.h>
#include "com_example_jnitest_MainActivity.h"
JNIEXPORT jstring JNICALL Java_com_example_jnitest_MainActivity_return_1string(JNIEnv *env, jclass)
{
return (*env)->NewStringUTF(env, "Hello from JNI !");
}
6.在自己创建的Android Project 下建文件夹jni,并且把.h文件和.c or .cpp文件拷贝到该目录下,并创建Android.mk文件,注意:在这的文件名必须是如所示的,
否则在生成.so是无法成功,如:
Android.mk文件的内容是:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS := -D__STDC_CONSTANT_MACROS -fvisibility=hidden
LOCAL_ARM_MODE := arm
LOCAL_LDLIBS :=-L$(SYSROOT)/usr/lib -llog
LOCAL_SRC_FILES := com_example_jnitest_MainActivity.c
LOCAL_MODULE := return_string
include $(BUILD_SHARED_LIBRARY)
7. 把整个Android Project copy 到unbuntu系统下,并且已经在ubuntu系统下安装了NDK ,那么转到Android Project下,也就是cd /home/JNItest 之后再使用NDK命令来生成so文件,使用:$NDK/ndk-build 就生成了.so文件,如:
8.在把生成so的Android Project转到Eclipes中,在重新RUN就可以实现JNI了,如同所示:
Android code:
package com.example.jnitest;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private Button MyJNI;
private TextView myOutput;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyJNI=(Button)findViewById(R.id.myJNI);
myOutput=(TextView)findViewById(R.id.myOutput);
MyJNI.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
myOutput.setText(return_string());
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public static native String return_string();
static{
System.loadLibrary("return_string");
}
}
在unbuntu线安装NDK的方法是:
1. 下载NDK:http://developer.android.com/sdk/ndk/index.html 在此下了android-ndk-r9;
2. 解压文件,并转到该目录下,使用getdit ~/.bashrc打开文件进行增加:NDK=/home/android-ndk-r9
3. 使用source ~/.bashrc进行重生成;
4. 验证echo $NDK ,有内容输出则配置成功;
5. 之后就可以转到Android Project下使用$NDK/ndk-build进行生成so了。
6. 生成so完成