2014-01-28 30 views
1

我需要c結構和java類模型之間的映射。原因是我想調用一個C的方法,它正在返回一個我在Java中擁有模型類的結構。我已經成功地調用了原始數據類型的本地方法或Java代碼中的void方法。但沒有與我的情況AlacFile或只是對象obj的任何對象。 看到我說的代碼。使用JNI調用非返回類型的方法的NDK

C代碼...

alac_file * Java_org_phlo_AirReceiver_AirReceiver_create_alac2(JNIEnv* env, 
     jclass thiz, int samplesize, int numchannels) { 

return create_alac(samplesize, numchannels); 
} 

alac_file *create_alac(int samplesize, int numchannels){ 
    alac_file *newfile = (alac_file*)malloc(sizeof(alac_file)); 

    newfile->samplesize = samplesize; 
    newfile->numchannels = numchannels; 
    newfile->bytespersample = (samplesize/8) * numchannels; 

    return newfile; 
} 

我有一種在C類中定義alac_file的結構。

我正在從java中調用此方法,如下所示。

public native AlacFile create_alac2(int samplesize , int numchannels); 

輸出;

編譯成功並運行。

當上述本地方法調用時收到崩潰。死機如下。

01-28 03:51:56.202: I/AirReceiver(31668): Registered AirTunes service   '[email protected] (p2p0)' on fe80::860:6eff:feb2:f10b%p2p0/fe80::860:6eff:feb2:f10b%p2p0%5 
01-28 03:51:56.212: I/System.out(31668): Loading libraray BEFORE 1111 
01-28 03:51:56.212: D/dalvikvm(31668): Trying to load lib /data/app-lib/com.example.airreceiver-1/libhairtunes.so 0x4212dad0 
01-28 03:51:56.232: D/dalvikvm(31668): Added shared lib /data/app-lib/com.example.airreceiver-1/libhairtunes.so 0x4212dad0 
01-28 03:51:56.232: D/dalvikvm(31668): No JNI_OnLoad found in /data/app-lib/com.example.airreceiver-1/libhairtunes.so 0x4212dad0, skipping init 
01-28 03:51:56.232: I/System.out(31668): Loading libraray AFTER 1111 
01-28 03:51:56.232: W/dalvikvm(31668): No implementation found for native Lorg/phlo/AirReceiver/AirReceiver;.create_alac2:(II)Lcom/beatofthedrum/alacdecoder/AlacFile; 
01-28 03:51:56.242: W/dalvikvm(31668): threadid=11: thread exiting with uncaught exception (group=0x419d6700) 
01-28 03:51:56.252: E/AndroidRuntime(31668): FATAL EXCEPTION: AsyncTask #1 
01-28 03:51:56.252: E/AndroidRuntime(31668): java.lang.RuntimeException: An error occured while executing doInBackground() 
01-28 03:51:56.252: E/AndroidRuntime(31668): at android.os.AsyncTask$3.done(AsyncTask.java:299) 
01-28 03:51:56.252: E/AndroidRuntime(31668): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
01-28 03:51:56.252: E/AndroidRuntime(31668): at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
01-28 03:51:56.252: E/AndroidRuntime(31668): at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
01-28 03:51:56.252: E/AndroidRuntime(31668): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
01-28 03:51:56.252: E/AndroidRuntime(31668): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
01-28 03:51:56.252: E/AndroidRuntime(31668): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
01-28 03:51:56.252: E/AndroidRuntime(31668): at java.lang.Thread.run(Thread.java:841) 
01-28 03:51:56.252: E/AndroidRuntime(31668): Caused by: java.lang.UnsatisfiedLinkError: Native method not found: org.phlo.AirReceiver.AirReceiver.create_alac2:(II)Lcom/beatofthedrum/alacdecoder/AlacFile; 
01-28 03:51:56.252: E/AndroidRuntime(31668): at org.phlo.AirReceiver.AirReceiver.create_alac2(Native Method) 
01-28 03:51:56.252: E/AndroidRuntime(31668): at org.phlo.AirReceiver.AirReceiver.main(AirReceiver.java:461) 
01-28 03:51:56.252: E/AndroidRuntime(31668): at com.example.droidairplayandroid.MainActivity$AirServerAsyncTask.doInBackground(MainActivity.java:66) 
01-28 03:51:56.252: E/AndroidRuntime(31668): at com.example.droidairplayandroid.MainActivity$AirServerAsyncTask.doInBackground(MainActivity.java:1) 
01-28 03:51:56.252: E/AndroidRuntime(31668): at android.os.AsyncTask$2.call(AsyncTask.java:287) 
01-28 03:51:56.252: E/AndroidRuntime(31668): at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
01-28 03:51:56.252: E/AndroidRuntime(31668): ... 4 more 
01-28 03:51:56.282: I/Process(31668): Sending signal. PID: 31668 SIG: 9 
+0

您可能需要將Java中的C結構解析爲直接的Byte(或其他)緩衝區,否則使用來自C的所謂的「反向」JNI調用來創建和操作Java對象的元素。 –

+0

@ChrisStratton當我發現崩潰作爲本地方法not found.I'll會嘗試反向jni調用。但是你也可以請你引導我的方式,你說的解析在Java中的C結構作爲直接字節(或任何)緩衝區作爲不正確地得到它。 – Manmohan

+0

閱讀有關ByteBuffer的文檔。你的崩潰可能是微不足道的,與這個功能性挑戰無關,比如命名問題甚至是構建問題。 –

回答

0

可能是您的方法簽名是careting問題。

public native AlacFile create_alac2(int samplesize , int numchannels); 

嘗試一次,

public native AlacFile createAlac2(int samplesize , int numchannels);//remove '-' here 

可能是其分裂創建和alac2。

2

你必須定義函數返回jobject。使用this example在C中創建Java對象的新實例,填充它並返回到Java。

+0

我也嘗試過jobject。但後來發現錯誤爲Ljava.lang.Object。 – Manmohan

+0

你可能做錯了什麼。嘗試按照我鏈接的例子。 –

+0

將再次嘗試,讓你知道.. – Manmohan

相關問題