boolean jboolean unsigned char 8 , unsigned
byte jbyte signed char 8
char jchar unsigned short 16 , unsigned
short jshort short 16
int jint long 32
long jlong __int64 64
float jfloat float 3 2
double jdouble double 64
void void n/a
Object _jobject *jobject
jobject mTestProvider;
jmethodID getTime;
jmethodID sayHello;
C中新建對象
jmethodID construction_id = (*jniEnv)->GetMethodID(jniEnv, TestProvider, " <init> ", " ()V ");
// 通過NewObject來創建對象
jobject mTestProvider = (*jniEnv)->NewObject(jniEnv, TestProvider,construction_id);
getTime = (*jniEnv)->GetStaticMethodID(jniEnv, TestProvider, " getTime ", " ()Ljava/lang/String; ");
非靜態:
sayHello = (*jniEnv)->GetMethodID(jniEnv, TestProvider, " sayHello ", " (Ljava/lang/String;)V ");
(*jniEnv)->CallStaticObjectMethod(jniEnv, TestProvider, getTime);
非靜態:
(*jniEnv)->CallVoidMethod(jniEnv, mTestProvider, sayHello,jstrMSG);
boolean Z
byte B
char C
short S
int I
long J
float F
double D
void V
object L用/分隔包的完整類名: Ljava/lang/String;
Array [簽名 [I [Ljava/lang/Object;
Method (參數1類型簽名 參數2類型簽名···)返回值類型簽名
int f2( int , long ) (IJ)I
boolean f3( int []) ([I)B
double f4(String, int ) (Ljava/lang/String;I)D
void f5( int , String [], char ) (I[Ljava/lang/String;C)V
圖解簽名:
Compiled from " TestNative.java "
public class video1.TestNative extends java.lang.Object{
public java.lang.String name;
Signature: Ljava/lang/String;
public video1.TestNative();
Signature: ()V
public int signTest( int, java.util.Date, int[]);
Signature: (ILjava/util/Date;[I)I
public native void sayHello();
Signature: ()V
public static void main(java.lang.String[]);
Signature: ([Ljava/lang/String;)V
}
TestNative完整代碼:
import java.util.Date;
public class TestNative {
public String name="Test";
public int number =100;
public int signTest( int i,Date date, int[] arr){
System.out.println("Sign Test");
return 0;
}
// native關鍵字修飾的方法,其內容是C/C++編寫的,java中不必為它編寫具體的實現
public native void sayHello();
public static void main(String[] args) {
System.loadLibrary("NativeCode");
TestNative tn = new TestNative();
tn.sayHello();
}
}
C/C++代碼
#include <iostream>
using namespace std;
JNIEXPORT void JNICALL Java_video1_TestNative_sayHello(JNIEnv * env, jobject obj){
cout<< " Hello Native Test ! "<<endl;
// 因為test不是靜態函數,所以傳進來的就是調用這個函數的對象
// 否則就傳入一個jclass對象表示native()方法所在的類
jclass native_clazz = env->GetObjectClass(obj);
// 得到jfieldID
jfieldID fieldID_prop = env->GetFieldID(native_clazz, " name ", " Ljava/lang/String; ");
jfieldID fieldID_num = env->GetFieldID(native_clazz, " number ", " I ");
// 得到jmethodID
jmethodID methodID_func=env->GetMethodID(native_clazz, " signTest ", " (ILjava/util/Date;[I)I ");
// 調用signTest方法
env->CallIntMethod(obj,methodID_func, 1L,NULL,NULL);
// 得到name屬性
jobject name = env->GetObjectField(obj,fieldID_name);
// 得到number屬性
jint number= env->GetIntField(obj,fieldID_num);
cout<<number<<endl; // 100
// 修改number屬性的值
env->SetIntField(obj,fieldID_num, 18880L);
number= env->GetIntField(obj,fieldID_num);
cout<<number<<endl; // 18880
}
本文地址,轉載請注明出處:
http://www.cnblogs.com/likwo/archive/2012/05/21/2512400.html
其他推薦學習網站
http://blog.csdn.net/ostrichmyself/article/details/4557851
http://blog.csdn.net/popop123/article/details/1511180
https://www.ibm.com/developerworks/cn/java/j-jni/
JNI 攻略系列
http://blog.csdn.net/yjkwf/article/details/7006260
http://blog.csdn.net/yjkwf/article/details/7006261
http://blog.csdn.net/yjkwf/article/details/7006264
http://blog.csdn.net/yjkwf/article/details/7006266
http://disanji.net/2011/01/26/android-jni-programming-2/
JNI Examples for Android
http://android.wooyd.org/JNIExample/files/JNIExample.pdf
JNI pthread 多線程使用
http://www.cnblogs.com/lknlfy/archive/2012/03/16/2400786.html