刚研究了java与C++的相互调用,赶紧记录下来。。。
一、java调用C++
- 要想让java调用C++,必须让C++函数按着命名规则来。命名规则为
返回值 Java_包路径_类名_函数名(JNIEnv* env,jobject obj);对应如下:
jint Java_com_ndk_testndk_TestHello_jnia(JNIEnv* env,jobject obj);
其中第二个参数为该类的对象,也就是TestHello的对象 - 例子如下:
-
- public class TestHello {
- public native String jnia();
- static {
-
-
-
- System.loadLibrary("TestNDK");
- }
- }
-
- #include <string h="">
- #include <jni h="">
- #include <android log="" h="">
- #include "TestNDK.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- jint Java_com_ndk_testndk_TestHello_jnia(JNIEnv* env,jobject obj){
- return 12;
- }
- #ifdef __cplusplus
- }
- #endif
- </android></jni></string>
二、C++调用java
C++调用java就会比较复杂了,先来了解一下基本的语法吧!
- JNIEnv* env;
- jclass cls;
- jobject obj;
- jmethodID mid;
-
- cls = jniEnv->FindClass("com/ndk/testndk/TestHello");
-
-
- obj = env->AllocObject(cls);
-
- jmethodID obj_id = env->GetMethodID(cls,"<init>", "()V");
- TestProvider mTestProvider = env->NewObject(cls,obj_id);
-
-
-
- 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);
- </init>
//-----------------开始写代码-----------------------------------------------------------------------------
-
- public class TestHello2 {
- public static String getStaticString(){
- return "Java静态的返回值";
- }
-
- public String getString(String str){
- str += ",还有非静态的。";
- Log.e("", str);
- return str;
- }
- }
-
- 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的最后一个参数如下图
以下是一些易犯的错误整理:
1.在java函数若是String型的,在jni调用是传参必须是env->NewStringUTF("这是字符串")
Demo下载地址:http://download.csdn.net/detail/super_level/7041419