RELATEED CONSULTING
相关咨询
选择下列产品马上在线沟通
服务时间:8:30-17:00
你可能遇到了下面的问题
关闭右侧工具栏

新闻中心

这里有您想知道的互联网营销解决方案
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
文章链接:http://cqwzjz.cn/article/ddpsgep.html