android ndk问题,Android ndk helloWord 问题集锦

1. 加载库的函数

java.lang.UnsatisfiedLinkError: Library foo not found

是 System.loadLibrary("jni");

不是System.load("jni");

2. 库的名字

libjni.so -> jni

3. jni的函数名

完全按照:java_pacakege_class_method 形式来命名。

java_com_example_jni_MainActivity_GetString();

//java

package com.example.jni;

import android.app.Activity;

import android.os.Bundle;

import android.view.Menu;

import android.view.MenuItem;

import android.widget.TextView;

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

TextView tv = new TextView(this);

tv.setText(GetString());

setContentView(tv);

}

public native String GetString();

static {

System.loadLibrary("jni");

}

}

//c

#include

#include

#ifdef __cplusplus

extern "C" {

#endif

//java_pacakege_class_method

jstring

Java_com_example_jni_MainActivity_GetString( JNIEnv* env,

jobject thiz )

{

return env->NewStringUTF( "Hello from JNI ! Compiled with ABI " );

}

#ifdef __cplusplus

}

#endif

一些问题与解决方法:

问题一:Android NDK: WARNING: APP_PLATFORM android-14 is larger than android:minSdkVersion 8 in ./AndroidManifest.xml    (这个是NDK工具的一个BUG,若build Target大于minSdkVersion,则会报这个错误,导致无法运行)

解决方法:

android-ndk-r8e/build/core/add-application.mk第128行把__ndk_warning改为__ndk_info;然后重新build一次项目即可消除错误。

原文:

this problem may be safely fixed by changing this line in add-application.mk from __ndk_warning to __ndk_info链接:

问题二:使用c++来编写本地库,会有一些兼容问题。

(1)直接黏贴HelloJni的stringFromJNI函数过来测试,提示Method 'NewStringUTF' could not be resolved解决方法:

改为:将(*env)->NewStringUTF(env, "Hello from JNI !")改为return env->NewStringUTF("Hello from JNI !")即可

原因是:

NDK plugin默认为我们生成的是cpp文件,而C与C++调用函数的参数不一致,因此找不到函数,具体参考jni.h中的定义。cpp文件中形如(*env)->Method(env, XXX)改成env->Method(XXX)即可。

(2)运行c++生成的.so库,若报以下错误:(既找不到函数)

No implementation found for native Lcom/dgut/android/MainActivity;.stringFromJNI ()Ljava/lang/String;

java.lang.UnsatisfiedLinkError: stringFromJNI

at com.dgut.android.MainActivity.stringFromJNI(Native Method)

#ifdef __cplusplus

extern "C" {

#endif

//

#ifdef __cplusplus

}

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值