C/C++和Java的互動詳解_java

來源:互聯網
上載者:User

安卓中支援c++(NDK)和java(SDK)語言,當使用到c++語言時,c++代碼和java如何互動就尤為重要。在下載的NDK包中samples/hello-jni有一個簡單的執行個體可以參考。

java調用C++

建立Android項目,建立如下類:

package com.example.testjni;public class TextJni {  // support to c  static {    System.loadLibrary("jniinterface");  }  public static native int getInt();  public static native String getString();}

上面聲明了兩個native方法,表示getInt和getString的方法實現將在c++(libjniinterface.so)中給出。

在classes目錄下運行如下命令,以產生native對應的實現檔案。

  javah com.example.testjni.TextJni  # 注意如果要有Android SDK的類需要指定classpath, 如  javah -classpath /Users/Richard/dev/android/sdk/platforms/android-19/android.jar:./bin/classes com.togic.gameengine.GFRenderer

產生標頭檔拷貝出來,建立jni檔案夾,並建立出cpp實現檔案

com_example_testjni_TextJni.cpp:#include <stdio.h>#include <stdlib.h>#include "com_example_testjni_TextJni.h"int sum (){  int x,y;  x = 100 ;  y = 1000;  x += y;  return x;}//實現 com_example_textjni_textJNI.h 的方法JNIEXPORT jint JNICALL Java_com_example_testjni_TextJni_getInt(JNIEnv * env, jclass cls){  return sum();}JNIEXPORT jstring JNICALL Java_com_example_testjni_TextJni_getString(JNIEnv * env, jclass cls){  return env->NewStringUTF("HelloNDK!");}

這裡要用到交叉編譯,組織c++代碼需要用Android.mk。

建立一個Android.mk檔案在jni/下

Android.mk:LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := jniinterfaceLOCAL_SRC_FILES := com_example_testjni_TextJni.cpp#LOCAL_C_INCLUDES := $(LOCAL_PATH)include $(BUILD_SHARED_LIBRARY)

然後就可以用NDK裡的工具:ndk-build來產生動態連結程式庫:libjniinterface.so

產生的庫檔案就可以被之前的Java檔案調用了。

c++ 調用 java

可以在上例中getString方法裡利用JNI調用java:

JNIEXPORT jstring JNICALL Java_com_togic_testjni2_TextJni_getString(JNIEnv * env, jclass cls){  jclass TextJni;  jobject instTextJni;  jmethodID getCurrInt;  JNIEnv* jniEnv = env;  TextJni = jniEnv->FindClass("com/togic/testjni2/TextJni");  jmethodID construction_id = jniEnv->GetMethodID(TextJni, "init", "()V");  instTextJni = jniEnv->NewObject(TextJni, construction_id);  getCurrInt = jniEnv->GetStaticMethodID(TextJni, "getCurrInt","()I");  // call java static method  jint jiref = jniEnv->CallStaticIntMethod(TextJni, getCurrInt);  // clean  jniEnv->DeleteLocalRef(TextJni);  jniEnv->DeleteLocalRef(instTextJni);  std::string strRef = "HelloNDK!" + view->getStaticString();  return env->NewStringUTF(strRef.c_str());}

首先值得注意的是jni.h裡的函數區分c和c++語言兩種介面,對於c++一般如下:

jclass clazz = env->FindClass(classname);

而對於c而言:

jclass clazz = (*env)->FindClass(env, classname);

GetMethodID中第三個參數表示方法簽名,可以按如下方法獲得:

javap -s 包名.類名   得到方法的簽名

附 JNI資料類型轉化

jstring 轉 char *
const char nativeString = (env)->GetStringUTFChars(env, javaString, 0);

返回指向字串的 UTF-8 字元數組的指標,該數組在被 ReleaseStringUTFChars() 釋放前將一直有效。

(*env)->ReleaseStringUTFChars(env, javaString, nativeString);
char * 轉 jstring
jstring jstr = (env)->NewStringUTF(env, char utf)

利用 UTF-8 字元數組構造新 java.lang.String 對象。

其他類型
全選複製放進筆記Java 類型 本地 c 類型 說明
boolean jboolean 無符號,8 位
byte jbyte 無符號,8 位
char jchar 無符號,16 位
short jshort 有符號,16 位
int jint 有符號,32 位
long jlong 有 符號,64 位元
float jfloat 32 位
double jdouble 64 位元
void void N/A

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.