JNI基础 c语言调用java方法
利用c語言調用java無參的方法
java方法
com.example.jniparsedata.ParseData類中的方法
?? ?//打印
?? ?public void sayHelloFromJava(){
?? ??? ?System.out.println("sayHelloFromJava");
?? ?}
?? ?
?? ?//c調用java中帶兩個參數的方法
?? ?public int javaAdd(int x,int y){
?? ??? ?return x + y;
?? ?}
?? ?//c調用java中參數為String的方法
?? ?public void printString(String s){
?? ??? ?System.out.println("java打印的字符串" + s);
?? ?}
?? ?//c語言中調用java靜態方法
?? ?public static void smethod(){
?? ??? ?System.out.println("我是java中的靜態方法");
?? ?}
?
其他類com.example.jniparsedata.OtherClass中的方法
public void methodFromOtherClass(){
?? ??? ? System.out.println("我是其他類中的方法 ");
?? ?}
1,在java類中聲明需要調用的c語言方法
//在java中同樣需要聲明
?? ?//c語言中調用java中無參方法
?? ?public native void callMethod1();
?? ?//c語言中調用java中int參數方法
?? ?public native void callMethod2();
?? ?//c語言中調用java中參數為String的方法
?? ?public native void callMethod3();
?? ?//c語言調用java中靜態方法
?? ?public native void callMethod4();
?? ?//c語言調用java中其他類的方法
?? ?public native void callMethod5();
2, 去項目的src目錄下執行命令
javah 類名
將src目錄下新生成的.h 文件拷貝到項目的jni目錄下
3? 引入Android.mk文件,建立.c文件,將.h文件中的方法copy到.c文件中,添加參數
4? c代碼中的方法實現
//c語言回調java方法
//這里是利用反射技術調用java方法
JNIEXPORT void JNICALL Java_com_example_jniparsedata_ParseData_callMethod1
(JNIEnv * env, jobject jobject) {
?? ?//1 利用反射拿到java類
?? ?jclass clazz = (*env)->FindClass(env,"com/example/jniparsedata/ParseData");//注意這里的.要換成/因為實在linux系統下
?? ?//2 需要得到方法的簽名 ,到項目的bin/classes目錄下使用命令javap -s 類名
?? ?//反射找到方法
?? ?jmethodID jmethodid = (*env)->GetMethodID(env,clazz,"sayHelloFromJava","()V");
?? ?//3調用
?? ?(*env)->CallVoidMethod(env,jobject,jmethodid);
}
JNIEXPORT void JNICALL Java_com_example_jniparsedata_ParseData_callMethod2
(JNIEnv *env, jobject jobject) {
?? ?//1 利用反射拿到java類
?? ?jclass clazz = (*env)->FindClass(env,"com/example/jniparsedata/ParseData");//注意這里的.要換成/因為實在linux系統下
?? ?//2 需要得到方法的簽名 ,到項目的bin/classes目錄下使用命令javap -s 類名
?? ?//反射找到方法
?? ?jmethodID jmethodid = (*env)->GetMethodID(env,clazz,"javaAdd","(II)I");
?? ?//3調用
?? ?int result = (*env)->CallIntMethod(env,jobject,jmethodid,3,5);
?? ?LOGI("x+y=%d", result);
}
JNIEXPORT void JNICALL Java_com_example_jniparsedata_ParseData_callMethod3
(JNIEnv *env, jobject jobject) {
?? ?jclass clazz = (*env)->FindClass(env,"com/example/jniparsedata/ParseData"); //注意這里的.要換成/因為實在linux系統下
?? ?//2 需要得到方法的簽名 ,到項目的bin/classes目錄下使用命令javap -s 類名
?? ?//反射找到方法
?? ?jmethodID jmethodid = (*env)->GetMethodID(env,clazz,"printString","(Ljava/lang/String;)V");
?? ?//生成java字符串
?? ?jstring str = (*env)->NewStringUTF(env,"c callback java");
?? ?//4調用
?? ?(*env)->CallVoidMethod(env,jobject,jmethodid,str);
}
JNIEXPORT void JNICALL Java_com_example_jniparsedata_ParseData_callMethod4
? (JNIEnv * env, jobject obj){
?? ?//c語言調用java中靜態方法
?? ?//1獲得java類的字節碼
?? ?jclass clazz = (*env)->FindClass(env,"com/example/jniparsedata/ParseData");//注意這里的.要換成/因為實在linux系統下
?? ?//2,獲得方法的ID
?? ?jmethodID methodId = (*env)->GetStaticMethodID(env,clazz,"smethod","()V");
?? ?//3,調用靜態方法
?? ?(*env)->CallStaticVoidMethod(env,clazz,methodId);
}
JNIEXPORT void JNICALL Java_com_example_jniparsedata_ParseData_callMethod5
? (JNIEnv * env, jobject obj){
?? ?//c語言中調用java中其他類中的方法
?? ?// 1,拿到類的字節碼
?? ?jclass clazz? = (*env)->FindClass(env,"com/example/jniparsedata/OtherClass");//注意這里的.要換成/因為實在linux系統下
?? ?//2,獲得類的方法
?? ?jmethodID methodId = (*env)->GetMethodID(env,clazz,"methodFromOtherClass","()V");
?? ?//3,獲得該方法類的對象
?? ?jobject object = (*env)->AllocObject(env,clazz);//注意這個jobject對象的名字和傳進來的jobject對象的名字不能重名
?? ?//調用方法
?? ?(*env)->CallVoidMethod(env,object,methodId);
}
轉載于:https://www.cnblogs.com/bxf123/p/5025830.html
總結
以上是生活随笔為你收集整理的JNI基础 c语言调用java方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用Qemu模拟vexpress-a9 (
- 下一篇: 2-字节流