程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> C/C++和Java的交互詳解

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

編輯:關於JAVA

C/C++和Java的交互詳解。本站提示廣大學習愛好者:(C/C++和Java的交互詳解)文章只能為提供參考,不一定能成為您想要的結果。以下是C/C++和Java的交互詳解正文


安卓中支撐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 := 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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved