欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2016年01月30日 12:07:07   投稿:hebedich  
本文旨在簡單的介紹一下如何讓java層和C/C++層相互調(diào)用,這里主要是使用了JNI技術(shù),并沒有深究其原理,只是做了個實現(xiàn),其目的是為后面的學(xué)習(xí)打開一扇窗。

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

java調(diào)用C++

新建Android項目,創(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();
}

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

在classes目錄下運行如下命令,以生成native對應(yīng)的實現(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實現(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;
}

//實現(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。

新建一個Android.mk文件在jni/下

Android.mk:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := jniinterface
LOCAL_SRC_FILES := com_example_testjni_TextJni.cpp

#LOCAL_C_INCLUDES := $(LOCAL_PATH)
include $(BUILD_SHARED_LIBRARY)

然后就可以用NDK里的工具:ndk-build來生成動態(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++語言兩種接口,對于c++一般如下:

jclass clazz = env->FindClass(classname);

而對于c而言:

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

GetMethodID中第三個參數(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 對象。

其他類型
全選復(fù)制放進筆記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

相關(guān)文章

  • Java中Random簡介_動力節(jié)點Java學(xué)院整理

    Java中Random簡介_動力節(jié)點Java學(xué)院整理

    本文詳細(xì)給大家介紹了Java中Random簡介相關(guān)知識,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-06-06
  • java 虛擬機深入了解

    java 虛擬機深入了解

    這篇文章主要介紹了java 虛擬機深入了解的相關(guān)資料,ava虛擬機有自己完善的硬體架構(gòu),如處理器、堆棧、寄存器等,還具有相應(yīng)的指令系統(tǒng),需要的朋友可以參考下
    2017-03-03
  • Springboot?-?Fat?Jar示例詳解

    Springboot?-?Fat?Jar示例詳解

    這篇文章主要介紹了Springboot?-?Fat?Jar詳解,Spring?Boot內(nèi)嵌容器,通過java?-jar命令便可以直接啟動應(yīng)用,今天帶著大家探索FAT?JAR啟動的背后原理,需要的朋友可以參考下
    2023-02-02
  • 詳解JUnit5參數(shù)化測試的幾種方式

    詳解JUnit5參數(shù)化測試的幾種方式

    參數(shù)化測試一直是津津樂道的話題,我們都知道JMeter有四種參數(shù)化方式:用戶自定義變量、用戶參數(shù)、CSV文件、函數(shù)助手,那么JUnit5有哪些參數(shù)化測試的方式呢
    2021-07-07
  • Spring Cloud如何使用Feign構(gòu)造多參數(shù)的請求

    Spring Cloud如何使用Feign構(gòu)造多參數(shù)的請求

    這篇文章主要介紹了Spring Cloud如何使用Feign構(gòu)造多參數(shù)的請求,以GET以及POST方法的請求為例進行講解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03
  • java如何接收和發(fā)送ASCII數(shù)據(jù)

    java如何接收和發(fā)送ASCII數(shù)據(jù)

    這篇文章主要介紹了java如何接收和發(fā)送ASCII數(shù)據(jù)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • java 調(diào)用本地?fù)P聲器的步驟

    java 調(diào)用本地?fù)P聲器的步驟

    博主的畢設(shè)系統(tǒng)在做一個餐廳的點餐管理系統(tǒng),在進行移動端頁面開發(fā)的時候突發(fā)奇想做一個呼叫功能,因此就有了這篇文章
    2021-05-05
  • Java集合Map常見問題_動力節(jié)點Java學(xué)院整理

    Java集合Map常見問題_動力節(jié)點Java學(xué)院整理

    這篇文章主要為大家詳細(xì)整理了Java集合Map常見問題,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • java 字符串反轉(zhuǎn)的實例詳解

    java 字符串反轉(zhuǎn)的實例詳解

    這篇文章主要介紹了java 字符串反轉(zhuǎn)的實例詳解的相關(guān)資料,這里提供實現(xiàn)代碼幫助大家學(xué)習(xí)參考這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • java基礎(chǔ)之反射和泛型以及注解

    java基礎(chǔ)之反射和泛型以及注解

    這篇文章主要介紹了 java基礎(chǔ)之反射和泛型以及注解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07

最新評論