成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JNI C/C++和Java的相互調(diào)用

lindroid / 1627人閱讀

摘要:安卓中支持和語言,當(dāng)使用到語言時(shí),代碼和如何交互就尤為重要。調(diào)用新建項(xiàng)目,創(chuàng)建如下類上面聲明了兩個(gè)方法,表示和的方法實(shí)現(xiàn)將在中給出。在目錄下運(yùn)行如下命令以生成對(duì)應(yīng)的實(shí)現(xiàn)文件。

安卓中支持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)中給出。

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

    javah com.example.testjni.TextJni
    # 注意如果要有Android SDK的類需要指定classpath, 如
    javah -classpath ~/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 
#include 
#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 := jniinterface
LOCAL_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ì)象。

其他類型

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

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65397.html

相關(guān)文章

  • Step By Step_Java通過JNI調(diào)C程序執(zhí)行

    摘要:以下將以一個(gè)實(shí)際例子展示通過調(diào)用打印主要記錄實(shí)現(xiàn)的過程和方法,對(duì)其中的一些原理和規(guī)范不做具體展開。指向在此代碼中實(shí)例化的對(duì)象的一個(gè)句柄,相當(dāng)于指針。加載本地共享庫運(yùn)行結(jié)果如下傳遞參數(shù)接下來看一下如何通過向傳遞參數(shù)。 showImg(https://segmentfault.com/img/remote/1460000008935007); 文章為本人編纂,轉(zhuǎn)載請(qǐng)聯(lián)系作者并注明出處。 在...

    mist14 評(píng)論0 收藏0
  • Andorid Studio NDK開發(fā)-Hello World

    摘要:介紹了在中配置的開發(fā)環(huán)境開發(fā)環(huán)境配置,開發(fā)環(huán)境配置完成之后,就要寫一下著名的程序了。尤其是但是并不妨礙你使用其他語言,只要調(diào)用約定支持就可以了。是指定所在的目錄,項(xiàng)目成功之后,會(huì)在目錄里生成文件。是包名加上類名。 介紹了在Android Studio中配置NDK的開發(fā)環(huán)境:Android Studio NDK開發(fā)-環(huán)境配置,NDK開發(fā)環(huán)境配置完成之后,就要寫一下著名的Hello Wor...

    melody_lql 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<