最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

安卓中支持c++(NDK)和java(SDK)語(yǔ)言,當(dāng)使用到c++語(yǔ)言時(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)中給出。

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

生成頭文件拷貝出來(lái),創(chuàng)建jni文件夾,并創(chuàng)建出cpp實(shí)現(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;
}

//實(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來(lái)生成動(dòng)態(tài)鏈接庫(kù):libjniinterface.so

生成的庫(kù)文件就可以被之前的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++語(yǔ)言兩種接口,對(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ì)象。

其他類型
全選復(fù)制放進(jìn)筆記Java 類型 本地 c 類型 說(shuō)明
boolean jboolean 無(wú)符號(hào),8 位
byte jbyte 無(wú)符號(hào),8 位
char jchar 無(wú)符號(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

相關(guān)文章

  • Spring?MVC和springboot靜態(tài)資源處理問題

    Spring?MVC和springboot靜態(tài)資源處理問題

    這篇文章主要介紹了Spring?MVC和springboot靜態(tài)資源處理問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • SpringBoot整合消息隊(duì)列RabbitMQ

    SpringBoot整合消息隊(duì)列RabbitMQ

    SpringBoot整合RabbitMQ很容易,但是整合的目的是為了使用,那要使用RabbitMQ就要對(duì)其有一定的了解,不然容易整成一團(tuán)漿糊。因?yàn)檎f(shuō)到底,SpringBoot只是在封裝RabbitMQ的API,讓其更容易使用而已,廢話不多說(shuō),讓我們一起整它
    2023-03-03
  • 解決IDEA中同項(xiàng)目引用報(bào)紅問題

    解決IDEA中同項(xiàng)目引用報(bào)紅問題

    在IDEA中,如果項(xiàng)目引用報(bào)紅,可能是因?yàn)镮DEA的引用緩存問題,可以通過File->Invalidate Caches/Restart清空緩存并重建索引來(lái)解決,這個(gè)方法可以幫助解決同項(xiàng)目中引用找不到的問題,恢復(fù)正常的項(xiàng)目引用,消除報(bào)紅
    2024-09-09
  • spring boot自定義log4j2日志文件的實(shí)例講解

    spring boot自定義log4j2日志文件的實(shí)例講解

    下面小編就為大家分享一篇spring boot自定義log4j2日志文件的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2017-11-11
  • Spring中ApplicationContextAware的使用方法詳解

    Spring中ApplicationContextAware的使用方法詳解

    ApplicationContextAware?通過它Spring容器會(huì)自動(dòng)把上下文環(huán)境對(duì)象調(diào)用ApplicationContextAware接口中的setApplicationContext方法,這篇文章主要介紹了Spring中ApplicationContextAware的作用,需要的朋友可以參考下
    2023-03-03
  • IDEA安裝Leetcode插件的教程

    IDEA安裝Leetcode插件的教程

    這篇文章主要介紹了IDEA安裝Leetcode插件的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 教你怎么用Java完成人民幣大寫轉(zhuǎn)化

    教你怎么用Java完成人民幣大寫轉(zhuǎn)化

    這篇文章主要介紹了教你怎么用Java完成人民幣大寫轉(zhuǎn)化,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • java 下執(zhí)行mysql 批量插入的幾種方法及用時(shí)

    java 下執(zhí)行mysql 批量插入的幾種方法及用時(shí)

    java 下執(zhí)行mysql 批量插入的幾種方法及用時(shí),1000次插入方法的比較。
    2013-04-04
  • Spring Boot使用AOP實(shí)現(xiàn)REST接口簡(jiǎn)易靈活的安全認(rèn)證的方法

    Spring Boot使用AOP實(shí)現(xiàn)REST接口簡(jiǎn)易靈活的安全認(rèn)證的方法

    這篇文章主要介紹了Spring Boot使用AOP實(shí)現(xiàn)REST接口簡(jiǎn)易靈活的安全認(rèn)證的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-11-11
  • SpringBoot中Zookeeper分布式鎖的原理和用法詳解

    SpringBoot中Zookeeper分布式鎖的原理和用法詳解

    Zookeeper是一個(gè)分布式協(xié)調(diào)服務(wù),它提供了高可用、高性能、可擴(kuò)展的分布式鎖機(jī)制,SpringBoot是一個(gè)基于Spring框架的開發(fā)框架,它提供了對(duì)Zookeeper分布式鎖的集成支持,本文將介紹SpringBoot中的 Zookeeper分布式鎖的原理和使用方法,需要的朋友可以參考下
    2023-07-07

最新評(píng)論

新乐市| 女性| 重庆市| 威海市| 鄢陵县| 潮州市| 凤山县| 昌黎县| 临沭县| 来安县| 邢台县| 文安县| 颍上县| 临武县| 泸西县| 新郑市| 万源市| 建宁县| 渭源县| 湘潭县| 郓城县| 武威市| 金川县| 行唐县| 新宁县| 读书| 霞浦县| 米林县| 珲春市| 眉山市| 上虞市| 合作市| 营山县| 武功县| 颍上县| 临武县| 延庆县| 建昌县| 黄陵县| 建湖县| 来宾市|