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://scyanting.com/article/ddpsgep.html