jni的好处勿用多说,下面直接看如何使用jni.
一般步骤为:在android主activity里加上:
-
package com.example.hellojni;
-
-
import android.os.Bundle;
-
import android.widget.TextView;
-
import android.app.Activity;
-
-
public class MainActivity extends Activity {
-
-
@Override
-
-
public void onCreate(Bundle savedInstanceState)
-
{
-
super.onCreate(savedInstanceState);
-
-
/* Create a TextView and set its content.
-
* the text is retrieved by calling a native
-
* function.
-
*/
-
TextView tv = new TextView(this);
-
tv.setText( stringFromJNI() );
-
setContentView(tv);
-
}
-
-
/* A native method that is implemented by the
-
* 'hello-jni' native library, which is packaged
-
* with this application.
-
*/
-
public native String stringFromJNI(); //表示此为本地调用方法
-
-
/* this is used to load the 'hello' library on application
-
* startup. The library has already been unpacked into
-
* /data/data/com.example.hellojni/lib/libhello-jni.so at
-
* installation time by the package manager.
-
*/
-
static {
-
System.loadLibrary("hello"); //hello为共享库libhello.so去头去尾的名称
-
}
-
}
接着在eclipse里直接run该android工程,得到相应的.class文件,或者在命令行生成。
获得.class文件后就要用javah获得相应的头文件,此头文件是供给c或c++代码使用。方法名必须与头文件里相同(确保jni能找到相应c方法)。使用javah容易出一个问题:
这时你首先要确定你是否将android.jar加入了CLASSPATH中。没有的话去你下载的android sdk的platforms下将其加入到CLASSPATH中。
完成后继续javah,如果还是报找不到类的错误。将路径改到src下。
此时就能正确生成头文件了。
-
/* DO NOT EDIT THIS FILE - it is machine generated */
-
#include <jni.h>
-
/* Header for class com_example_hellojni_MainActivity */
-
-
#ifndef _Included_com_example_hellojni_MainActivity
-
#define _Included_com_example_hellojni_MainActivity
-
#ifdef __cplusplus
-
extern "C" {
-
#endif
-
/*
-
* Class: com_example_hellojni_MainActivity
-
* Method: stringFromJNI
-
* Signature: ()Ljava/lang/String;
-
*/
-
JNIEXPORT jstring JNICALL Java_com_example_hellojni_MainActivity_stringFromJNI
-
(JNIEnv *, jobject);
-
-
#ifdef __cplusplus
-
}
-
#endif
-
#endif
下面就是写C码了。
-
#include<jni.h>
-
#include<stdio.h>
-
#include<string.h>
-
-
JNIEXPORT jstring JNICALL Java_com_example_hellojni_MainActivity_stringFromJNI
-
(JNIEnv *env, jobject obj){
-
return (*env)->NewStringUTF(env, "Hello from JNI !");
-
}
然后添上mk文件就可以编译了。最终将生成的.so文件添加到安卓工程的libs/armeabi下,就能正常运行了。
阅读(1460) | 评论(0) | 转发(0) |