ndk调用java代码 jdk ndk sdk

ndk生成的so怎么在java调用

1. 自己写.c文件,然后生成so库

创新互联公司专注于蔡甸网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供蔡甸营销型网站建设,蔡甸网站制作、蔡甸网页设计、蔡甸网站官网定制、微信小程序开发服务,打造蔡甸网络公司原创品牌,更为您提供蔡甸网站排名全网营销落地服务。

2. 引用别人的链手静态库,或者动态库来生成新的jni调用库。

我们先来看最简单的编写一个jni调用的so库,包含一个获棚让嫌取字符串的方法,通过这个列子,我们主要是了解怎滑仔么在android的工程中调用jni的库,以及要注意的问题。

第一步:首先我们来看下我们的工程的目录

jni目录是我们生成库的文件,里面包含了一个.mk编译文件以及一系列的.c文件

libs目录是我们编译jni目录下的mk文件动态生成的。

当我们写好了jni下面的库文件以后,在当前目录下执行ndk-build则会自动生成我们需要调用的.so库文件。

第二步: java里面怎么调用jni的库文件,我们先看代码

public class MainActivity extends Activity {

/* A native method that is implemented by the

* 'hello-jni' native library, which is packaged

* with this application.

*/

public native String stringFromJNI();

/* this is used to load the 'hello-jni' library on application

* startup. The library has already been unpacked into

* /data/data/com.example.HelloJni/lib/libhello-jni.so at

* installation time by the package manager.

*/

static {

System.loadLibrary("hello-jni");

}

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

String str = stringFromJNI();

System.out.println("*****str:" + str);

}

}

在java文件中要做到调用jni文件生成的so库,需要做到2步

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 就运行正常啦。

新闻名称:ndk调用java代码 jdk ndk sdk
文章网址:https://www.cdcxhl.com/article48/ddpsgep.html

成都网站建设公司_创新互联,为您提供搜索引擎优化网站内链网站设计公司网站改版外贸建站企业网站制作

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都app开发公司