一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務(wù)器之家 - 編程語言 - JAVA教程 - C/C++和Java的交互詳解

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

2020-03-25 13:37hebedich JAVA教程

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

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

java調(diào)用C++

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

?
1
2
3
4
5
6
7
8
9
10
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的方法實(shí)現(xiàn)將在c++(libjniinterface.so)中給出。

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

?
1
2
3
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)文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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。

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

?
1
2
3
4
5
6
7
8
9
10
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:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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++一般如下:

?
1
jclass clazz = env->FindClass(classname);

而對于c而言:

?
1
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ù)制放進(jìn)筆記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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 青草视频免费观看 | 亚洲色大成网站www久久九九 | 亚飞与亚基高清国语在线观看 | 男女视频在线观看网站 | 性一交一乱一伧老太 | 东京道一本热大交乱 | 天天天做天天天天爱天天想 | 青青国产在线观看 | 国产一区二区三区久久小说 | www视频免费观看 | 亚洲一区二区三区在线播放 | 国产视频福利 | 九九热免费在线观看 | 精品国产自在现线久久 | 欧美国产日韩在线 | 2020国产精品亚洲综合网 | 911亚洲精品国内自产 | 视频国产91 | 欧美高清在线 | 日比免费视频 | 99久久综合 | 师尊被各种play打屁股 | 无码乱人伦一区二区亚洲 | 亚洲品质自拍视频 | 办公室大战秘书呻吟 | 三级伦理在线播放 | 日韩在线一区 | 国产成人久久精品区一区二区 | 视频一区国产精戏刘婷 | 天作谜案免费完整版在线观看 | 果冻传媒第一二三专区 | 国产精品秒播无毒不卡 | 精品一区二区免费视频蜜桃网 | 黄www片 | 草莓秋葵菠萝蜜绿巨人污 | 国产福利自产拍在线观看 | 天堂69亚洲精品中文字幕 | 范冰冰a级一级特级毛片 | 欧美在线播放成人免费 | 胖女性大bbbbbb | 香蕉精品国产高清自在自线 |