jniはjava層の静的および非静的関数を呼び出す
2980 ワード
jni呼び出しjavaの関数は大きく次の3つのステップに分けられます.(*env)->FindClassによってクラスのオブジェクトが見つかりました メソッドId は、(*env)->GetMethodIDによって取得されるコール(*env)-
実装手順の詳細まずjava層の静的および非静的方法 を記述する javaレイヤnativeメソッド宣言を作成し、メソッド登録を使用してc言語を生成する.hファイルを登録します.登録方法は を参照してください..h対応の.cファイルを新規作成し、.hファイル を導入 javaスタティックメソッド をCで呼び出すは、java非静的方法 をCで呼び出す.
ソースのgithubアドレス
実装手順の詳細
package clz;
public class ClassMethod {
public ClassMethod(){ //
System.out.println("ClassMethod() constructor");
}
private static void callStaticMethod(String str, int i) { //
System.out.format("ClassMethod::callSatticMethod called!-->str=%s,"+
" i=%d
", str,i);
}
private void callInstanceMethod(String str, int i) { //
System.out.format("ClassMethod::callInstanceMethod called!-->str=%s,"+
"i=%d
",str,i);
}
}
public class JniTest {
native void callJavaStaticMethod();
native void callJavaInstanceMethod();
}
#include "clz_JniTest.h"
JNIEXPORT void JNICALL Java_clz_JniTest_callJavaStaticMethod
(JNIEnv *env, jobject jobject){
//1. class
jclass clz = (*env)->FindClass(env,"clz/ClassMethod");
if(clz == NULL){
printf("clz is null");
return;
}
//2. id
jmethodID jmeid = (*env)->GetStaticMethodID(env,clz,"callStaticMethod","(Ljava/lang/String;I)V");
if(jmeid==NULL){
printf("jmeid is null");
return;
}
jstring arg = (*env)->NewStringUTF(env," ");
//3. java
(*env)->CallStaticVoidMethod(env,clz,jmeid,arg,100);
(*env)->DeleteLocalRef(env,clz);
(*env)->DeleteLocalRef(env,arg);
}
JNIEXPORT void JNICALL Java_clz_JniTest_callJavaInstanceMethod
(JNIEnv * env, jobject jobject0){
//1. class
jclass clz = (*env)->FindClass(env,"clz/ClassMethod");
if(clz == NULL){
printf("clz is null");
return;
}
//2.
jmethodID jcmid = (*env)->GetMethodID(env,clz,"","()V");
if(jcmid == NULL){
printf("jcmid is null");
return;
}
//3.
jobject jobject = (*env)->NewObject(env,clz,jcmid);
if(jobject == NULL){
printf("jobject is NULL");
return;
}
//4. id
jmethodID jmeid = (*env)->GetMethodID(env,clz,"callInstanceMethod","(Ljava/lang/String;I)V");
if(jmeid==NULL){
printf("jmeid is null");
return;
}
jstring arg = (*env)->NewStringUTF(env,"hello from jni");
//5.
(*env)->CallVoidMethod(env,jobject,jmeid,arg,100);
(*env)->DeleteLocalRef(env,clz);
(*env)->DeleteLocalRef(env,jobject);
(*env)->DeleteLocalRef(env,arg);
}
ソースのgithubアドレス