上面的都是基本类型。如果Java函数的参数是class,则以"L"开头,以";"结尾,中间是用"/" 隔开的包及类名。而其对应的C函数名的参数则为jobject. 一个例外是String类,其对应的类为jstring
Ljava/lang/String; String jstring
Ljava/net/Socket; Socket jobject
如果JAVA函数位于一个嵌入类,则用$作为类名间的分隔符。
例如 "(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z"
Android JNI编程实践
一、直接使用java本身jni接口(windows/ubuntu)
1.在Eclipsh中新建一个android应用程序。两个类:一个继承于Activity,UI显示用。另一个包含native方法。编译生成所有类。
java代码:
- package eoe.jnitest;
- import android.app.Activity;
- import android.os.Bundle;
- public class jnitest extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Nadd cal = new Nadd();
- setTitle("The Native Add Result is " + String.valueOf(cal.nadd(10, 19)));
- }
- }
- //Nadd.java文件:
- package eoe.jnitest;
- public class Nadd {
- static {
- System.loadLibrary ("Nadd");
- }
- public native int nadd(int a, int b);
- }
使用javah命令生成C/C++的.h文件。注意类要包含包名,路径文件夹下要包含所有包中的类,否则会报找不到类的错误。classpath参数指定到包名前一级文件夹,文件夹层次结构要符合java类的组织层次结构。
java代码:
- #include
- #ifndef _Included_com_hello_jnitest_Nadd
- #define _Included_com_hello_jnitest_Nadd
- #ifdef __cplusplus
- extern "C" {
- #endif
- JNIEXPORT jint JNICALL Java_com_hello_jnitest_Nadd_nadd
- (JNIEnv *, jobject, jint, jint);
- #ifdef __cplusplus
- }
3.编辑.c文件实现native方法。
com_hello_jnitest_Nadd.c文件:
java代码:
- #include
- #include "com_hello_jnitest_Nadd.h"
- JNIEXPORT jint JNICALL Java_com_hello_jnitest_Nadd_nadd(JNIEnv * env, jobject c, jint a, jint b)
- {
- return (a+b);
- }
系列之Android 深入研究JNI(五)的帖子链接http://www.eoeandroid.com/thread-87022-1-1.html