摘要:安卓中支持和語言,當使用到語言時,代碼和如何交互就尤為重要。調用新建項目,創建如下類上面聲明了兩個方法,表示和的方法實現將在中給出。在目錄下運行如下命令以生成對應的實現文件。
安卓中支持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)中給出。
在bin/classes目錄下運行如下命令,以生成native對應的實現文件。
javah com.example.testjni.TextJni # 注意如果要有Android SDK的類需要指定classpath, 如 javah -classpath ~/dev/android/sdk/platforms/android-19/android.jar:./bin/classes com.togic.gameengine.GFRenderer
生成頭文件拷貝出來,創建jni文件夾,并創建出cpp實現文件
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; } //實現 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來生成動態鏈接庫: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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65397.html
摘要:以下將以一個實際例子展示通過調用打印主要記錄實現的過程和方法,對其中的一些原理和規范不做具體展開。指向在此代碼中實例化的對象的一個句柄,相當于指針。加載本地共享庫運行結果如下傳遞參數接下來看一下如何通過向傳遞參數。 showImg(https://segmentfault.com/img/remote/1460000008935007); 文章為本人編纂,轉載請聯系作者并注明出處。 在...
摘要:介紹了在中配置的開發環境開發環境配置,開發環境配置完成之后,就要寫一下著名的程序了。尤其是但是并不妨礙你使用其他語言,只要調用約定支持就可以了。是指定所在的目錄,項目成功之后,會在目錄里生成文件。是包名加上類名。 介紹了在Android Studio中配置NDK的開發環境:Android Studio NDK開發-環境配置,NDK開發環境配置完成之后,就要寫一下著名的Hello Wor...
閱讀 1390·2023-04-25 18:34
閱讀 3443·2021-11-19 09:40
閱讀 2830·2021-11-17 09:33
閱讀 2940·2021-11-12 10:36
閱讀 2831·2021-09-26 09:55
閱讀 2658·2021-08-05 10:03
閱讀 2521·2019-08-30 15:54
閱讀 2867·2019-08-30 15:54