「ndk调用java」Ndk开发

博主:adminadmin 2023-01-23 04:00:10 394

本篇文章给大家谈谈ndk调用java,以及Ndk开发对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

“Android NDK ”是什么,在什么情况下使用?

1、NDK是一系列工具的集合。

2、NDK提供了一份稳定、功能有限的API头文件声明。

3、NDK的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。

4、NDK将使Android平台支持C开发的开端。

NDK使得在android中,java可以调用C函数库。我们都知道,java是半解释型语言,很容易被反汇编后拿到源代码文件,在开发一些重要协议时,我们为了安全起见,使用C语言来编写这些重要的部分,来增大系统的安全性。还有,在一些接近硬件环境下,相信大家都清楚C与java的优劣。顺带提一下:NDK并不能显著提升应用效率。why?我们都觉得C语言比起java来说效率要高出很多,一方面,随着jdk的不断更新,java的效率也随之提高;另一方面,即便使用C语言编码提高了应用效率,但是在java与C相互调用时平白又增大了开销。

1、NDK是一系列工具的集合。

NDK提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。

NDK集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。

NDK可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作。

2、NDK提供了一份稳定、功能有限的API头文件声明。

Google明确声明该API是稳定的,在后续所有版本中都稳定支持当前发布的API。从该版本的NDK中看出,这些API支持的功能非常有限,包含有:C标准库(libc)、标准数学库(libm)、压缩库(libz)、Log库(liblog)。

3、NDK的发布,使“Java+C”的开发方式终于转正,成为官方支持的开发方式。

使用NDK,我们可以将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

使用NDK,我们可以将需要保密的应用逻辑使用C开发。毕竟,Java包都是可以反编译的。

NDK促使专业so组件商的出现。(乐观猜想,要视乎Android用户的数量)

4、NDK将使Android平台支持C开发的开端。

NDK提供了的开发工具集合,使开发人员可以便捷地开发、发布C组件。同时,Google承诺在NDK后续版本中提高“可调式”能力,即提供远程的gdb工具,使我们可以便捷地调试C源码。在支持Android平台C开发,我们能感觉到Google花费了很大精力,我们有理由憧憬“C组件支持”只是Google Android平台上C开发的开端。毕竟,C程序员仍然是码农阵营中的绝对主力,将这部分人排除在Android应用开发之外,显然是不利于Android平台繁荣昌盛的。

android ndk 开发,C++ 调用Java的方法

Android.mk文件:

LOCAL_SRC_FILES参数用空格隔开

[c-sharp] view plaincopyprint?

LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE:=native

LOCAL_SRC_FILES:=geolo.cpp my_jni.h

include $(BUILD_SHARED_LIBRARY)

2. geolo.cpp

先用FindClass方法找到java类,有点类似java的反射用LoadClass

再用CallObjectMethod方法调用Java类的函数。

[c-sharp] view plaincopyprint?

#include "my_jni.h"

jobject getInstance(JNIEnv* env, jclass obj_class){

jmethodID construction_id = env-GetMethodID(obj_class, "init", "()V");

jobject obj = env-NewObject(obj_class, construction_id);

return obj;

}

JNIEXPORT jstring JNICALL Java_com_easepal_geolo_CActivityMain_stringFromJNI(JNIEnv* env, jobject thiz){

jstring str;

jclass java_class = env-FindClass("com/easepal/geolo/CForCall");

if (java_class == 0){

return env-NewStringUTF("not find class!");

}

jobject java_obj = getInstance(env, java_class);

if (java_obj == 0){

return env-NewStringUTF("not find java OBJ!");

}

jmethodID java_method = env-GetMethodID(java_class, "GetJavaString", "()Ljava/lang/String;");

if(java_method == 0){

return env-NewStringUTF("not find java method!");

}

str = (jstring)env-CallObjectMethod(java_obj, java_method);

return str;

}

3. my_jni.h

[c-sharp] view plaincopyprint?

/* DO NOT EDIT THIS FILE - it is machine generated */

#include jni.h

/* Header for class com_easepal_geolo_CActivityMain */

#ifndef _Included_com_easepal_geolo_CActivityMain

#define _Included_com_easepal_geolo_CActivityMain

#ifdef __cplusplus

extern "C" {

#endif

/*

* Class:     com_easepal_geolo_CActivityMain

* Method:    stringFromJNI

* Signature: ()Ljava/lang/String;

*/

JNIEXPORT jstring JNICALL Java_com_easepal_geolo_CActivityMain_stringFromJNI(JNIEnv *, jobject);

#ifdef __cplusplus

}

#endif

#endif

4. CActivityMain.java

[c-sharp] view plaincopyprint?

package com.easepal.geolo;

import android.app.Activity;

import android.os.Bundle;

import android.widget.TextView;

public class CActivityMain extends Activity {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState){

super.onCreate(savedInstanceState);

TextView tv = new TextView(this);

tv.setText( stringFromJNI("hello") );

setContentView(tv);

}

static {

System.loadLibrary("native");

}

public native String stringFromJNI(String str);

}

5. CForCall.java

[c-sharp] view plaincopyprint?

package com.easepal.geolo;

public class CForCall{

public CForCall(){};

//public ~CForCall(){};

public String GetJavaString(){

String str;

str = "123456";

return str;

}

}

Qt for Android生成的so库,在Java for Android中被调用,请问有什么思路吗?

可以调用,但是不能直接调用,要通过代码目的JNI去调用,在JNI中导入头文件,通过NDK编译成功后即可。

NDK编译步骤:

1.选择 ndk 自带的例子 hello-jni ,我的位于E:\android-ndk-r5\samples\hello-jni( 根据具体的安装位置而定 ) 。

2.运行 cygwin ,输入命令 cd /cygdrive/e/android-ndk-r5/samples/hello-jni ,进入到 E:\android-ndk-r5\samples\hello-jni 目录。

3.输入 $NDK/ndk-build ,执行成功后,它会自动生成一个 libs 目录,把编译生成的 .so 文件放在里面。 ($NDK是调用我们之前配置好的环境变量, ndk-build 是调用 ndk 的编译程序 )

4.此时去 hello-jni 的 libs 目录下看有没有生成的 .so 文件,如果有,ndk 就运行正常啦。

如何解决android NDK开发中的NDK

android sdk

(Android Software Development Kit, 即Android软件开发工具包)

包含了SDK Manager 和 AVD Manage对于android系统的一些开发版本的管理以及模拟器管理。

ndk

(Native Development Kit)跟sdk差不多的是它也是一个开发工具包。用它开发c/c++是很方便的。它有一个强大的编译集合。

JNI

是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是CC++)

JNI是java语言提供的Java和C/C++相互沟通的机制,Java可以通过JNI调用本地的C/C++代码,本地的C/C++的代码也可以调用java代码。JNI 是本地编程接口,Java和C/C++互相通过的接口。Java通过C/C++使用本地的代码的一个关键性原因在于C/C++代码的高效性。

NDK是一系列工具的集合。它提供了一系列的工具,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk。这些工具对开发者的帮助是巨大的。它集成了交叉编译器,并提供了相应的mk文件隔离CPU、平台、ABI等差异,开发人员只需要简单修改mk文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so。它可以自动地将so和Java应用一起打包,极大地减轻了开发人员的打包工作

ndk调用java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于Ndk开发、ndk调用java的信息别忘了在本站进行查找喔。