程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> android-java與C++的相互調用-隨心

android-java與C++的相互調用-隨心

編輯:C++入門知識

剛研究了java與C++的相互調用,趕緊記錄下來。。。
一、java調用C++
要想讓java調用C++,必須讓C++函數按著命名規則來。命名規則為
返回值 Java_包路徑_類名_函數名(JNIEnv* env,jobject obj);對應如下:
jint Java_com_ndk_testndk_TestHello_jnia(JNIEnv* env,jobject obj);
其中第二個參數為該類的對象,也就是TestHello的對象例子如下:

//java代碼
public class TestHello {
	public native String jnia();
	static {
		// 加載libAppConfig.so庫文件
		// AppConfig是添加 Android Native Support時輸入的名稱
		// 另外,通過修改Android.mk中的LOCAL_MODULE可以修改這個名稱
		System.loadLibrary("TestNDK");
	}
}
//C++代碼
#include 
#include 
#include 
#include "TestNDK.h"
#ifdef __cplusplus  //最好有這個,否則被編譯器改了函數名字找不到不要怪我
extern "C" {
#endif
jint Java_com_ndk_testndk_TestHello_jnia(JNIEnv* env,jobject obj){
	return 12;
}
#ifdef __cplusplus
}
#endif
二、C++調用java
C++調用java就會比較復雜了,先來了解一下基本的語法吧!
JNIEnv* env;
jclass cls;//對用java的Class
jobject obj;
jmethodID mid;//映射方法
//構建一個Class
cls = jniEnv->FindClass("com/ndk/testndk/TestHello");//寫上類的路徑
//實例化對象
//方法一
obj = env->AllocObject(cls);
//方法二
jmethodID obj_id = env->GetMethodID(cls,"", "()V");
TestProvider mTestProvider = env->NewObject(cls,obj_id);
//映射方法
//其中"()Ljava/lang/String;",括號是參數,Ljava/lang/String;是返回值,如有參數string,即為"(Ljava/lang/String;)Ljava/lang/String;"
//靜態
mid = env->GetStaticMethodID(cls, "getStaticString","()Ljava/lang/String;");
//非靜態
mid = env->GetMethodID(cls, "getString","()Ljava/lang/String;");
//調用方法
//靜態:
env->CallStaticObjectMethod(cls, mid);
//非靜態:
env->CallVoidMethod(obj, mid,jstr);
//-----------------開始寫代碼-----------------------------------------------------------------------------
//java部分
public class TestHello2 {
	public static String getStaticString(){
		return "Java靜態的返回值";
	}
	
	public String getString(String str){
		str += ",還有非靜態的。";
		Log.e("", str);
		return str;
	}
}
//C++部分
jstring Java_com_ndk_testndk_TestHello_jnistr(JNIEnv* env,jobject obj){
	jclass cls = env->FindClass("com/ndk/testndk/TestHello2");
	jobject obj1 = env->AllocObject(cls);
	jmethodID mid1 = env->GetStaticMethodID(cls, "getStaticString","()Ljava/lang/String;");
	jmethodID mid2 = env->GetMethodID(cls, "getString","(Ljava/lang/String;)Ljava/lang/String;");
	//靜態:
	jstring jstr = (jstring) env->CallStaticObjectMethod(cls, mid1);
	//非靜態:
	jstring jstr2 = (jstring) env->CallObjectMethod(obj1, mid2,jstr);
	return jstr2;
}

getStaticMethodInfo和getMethodInfo的最後一個參數如下圖


下載地址:http://download.csdn.net/detail/super_level/7041419

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved