国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

C/C++和Java的交互詳解

2019-11-26 14:38:45
字體:
供稿:網(wǎng)友

安卓中支持c++(NDK)和java(SDK)語言,當(dāng)使用到c++語言時(shí),c++代碼和java如何交互就尤為重要。在下載的NDK包中samples/hello-jni有一個(gè)簡(jiǎn)單的實(shí)例可以參考。

java調(diào)用C++

新建Android項(xiàng)目,創(chuàng)建如下類:

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

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

在classes目錄下運(yùn)行如下命令,以生成native對(duì)應(yīng)的實(shí)現(xiàn)文件。

  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

生成頭文件拷貝出來,創(chuàng)建jni文件夾,并創(chuàng)建出cpp實(shí)現(xiàn)文件

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;}//實(shí)現(xiàn) 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。

新建一個(gè)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來生成動(dòng)態(tài)鏈接庫:libjniinterface.so

生成的庫文件就可以被之前的Java文件調(diào)用了。

c++ 調(diào)用 java

可以在上例中g(shù)etString方法里利用JNI調(diào)用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里的函數(shù)區(qū)分c和c++語言兩種接口,對(duì)于c++一般如下:

jclass clazz = env->FindClass(classname);

而對(duì)于c而言:

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

GetMethodID中第三個(gè)參數(shù)表示方法簽名,可以按如下方法獲得:

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

附 JNI數(shù)據(jù)類型轉(zhuǎn)化

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

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

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

利用 UTF-8 字符數(shù)組構(gòu)造新 java.lang.String 對(duì)象。

其他類型
全選復(fù)制放進(jìn)筆記Java 類型 本地 c 類型 說明
boolean jboolean 無符號(hào),8 位
byte jbyte 無符號(hào),8 位
char jchar 無符號(hào),16 位
short jshort 有符號(hào),16 位
int jint 有符號(hào),32 位
long jlong 有 符號(hào),64 位
float jfloat 32 位
double jdouble 64 位
void void N/A

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 犍为县| 莎车县| 泸西县| 泌阳县| 商南县| 滨海县| 镇安县| 开平市| 丰宁| 肃北| 平谷区| 名山县| 东至县| 潼南县| 孙吴县| 封丘县| 黑龙江省| 开江县| 新沂市| 兴安县| 南漳县| 科技| 鹰潭市| 神木县| 莒南县| 会理县| 沙田区| 张家港市| 蒙自县| 珠海市| 平顶山市| 鄱阳县| 定边县| 长寿区| 甘南县| 新龙县| 潼关县| 敖汉旗| 富锦市| 花莲市| 高阳县|